我在项目中创建了一个WCF REST样式服务。在开发中,我能够指定访问我的服务的相对URL,
jQuery.ajax({
url: "/WebServices/AddressWebService.svc/GetCountry",
datatype: "json",
success: function (data) {
jQuery.each(data.GetCountryResult, function (index, value) {
//value.entityData.CountryGuid
//value.entityData.CountryName
$('#dataCountry').empty();
$('#dataCountry').append('<option value="' + value.entityData.CountryGuid + '">' + value.entityData.CountryName + '</option>');
});
}
});
当我托管到IIS(使用端口81),根文件夹名称为c2c时,我无法再访问该服务
使用fire bug,我试图看到标题,我的相对url(“/ WebServices/AddressWebService.svc/GetCountry”)被附加到我的主机(localhost:81),但虚拟文件夹名称(c2c)没有附加结果它显示文件未找到异常
如果我使用完全限定的URL(http:// localhost:81 / c2c / WebServices / AddressWebService.svc / GetCountry),它可以正常工作。
如果我使用的是完全合格的网址,那么转移到制作时很难做出更改。虽然我们可以使用全局变量来存储webroot(在本例中为c2c)
有没有解决这个问题的简单解决方案,我还在配置文件中给出了基地址
<system.serviceModel>
</binding>
</webHttpBinding>
</bindings>
<services>
<service name="c2c.WebServices.AddressWebService" behaviorConfiguration="jsonBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:81/c2c"/>
</baseAddresses>
</host>
<endpoint address="" binding="webHttpBinding" bindingConfiguration="webmax" contract="c2c.WebServices.IAddressWebService" behaviorConfiguration="jsonendpointBehavior" />
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
</service>
</services>
答案 0 :(得分:3)
您需要获取对ajax
方法调用的相对URL。通常我做的是
$.ajax({ url: "<%=ResolveUrl("~/Services/Service.asmx/ServiceMethod") %>" });
(显然,你需要设置其余的参数,这必须在ASP .NET控件(如页面)上。)
但是,如果您没有在页面上吐出JavaScript,那将无效。在这种情况下,您需要将Web服务的URL传递给JavaScript对象或命名空间,该对象或命名空间在JavaScript包含文件中定义。所以你可能会有这样的事情:
MyServiceMethodCaller.serviceUrl = "<%=ResolveUrl("~/Services/Service.asmx/ServiceMethod") %>";
您在JavaScript包含文件中定义MyServiceMethodCaller
命名空间。这样,在您的包含文件中,您可以:
var MyServiceMethodCaller = {
serviceUrl: "",
serviceMethod: function() {
$.ajax({ url: this.serviceUrl });
}
}
我认为这应该有效。我没有在一个经过测试的,可行的例子中提出它,但你得到了它的要点。
答案 1 :(得分:0)
尝试更改基地址以使用尾部斜杠。 e.g。
<baseAddresses>
<add baseAddress="http://localhost:81/c2c/"/>
</baseAddresses>
答案 2 :(得分:0)
您的整个网站是否位于/c2c/
虚拟路径本地,用于本地主机测试,但是将部署在生产中的/
运行?如果是这样,最简单的方法是使本地主机环境与生产相匹配(即从本地IIS路径中删除/c2c/
)。
如果没有,并且/c2c/
是生产中的所有内容,那么在jQuery代码中使用/c2c/WebServices/AddressWebService.svc/GetCountry
之类的URL是合理的。即使您需要更改它们,也可以搜索/替换url: "/c2c/
=&gt; url: "/
是一种相对安全/轻松的重构。