WCF REST服务URL

时间:2011-04-23 05:09:49

标签: asp.net wcf rest

我在项目中创建了一个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> 

 

3 个答案:

答案 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: "/是一种相对安全/轻松的重构。