【问题标题】:WCF REST Service urlWCF REST 服务网址
【发布时间】:2011-04-23 05:09:49
【问题描述】:

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




            });

        }

    });

当我使用根文件夹名称 c2c 托管到 IIS(使用端口 81)时,我不再能够访问该服务

使用 fire bug,我试图查看标题,我的相对 url ("/WebServices/AddressWebService.svc/GetCountry) 被附加到我的主机 (localhost:81) 但虚拟文件夹名称 (c2c) 没有被附加. 结果显示文件未找到异常

如果我使用完整的限定 url (http://localhost:81/c2c/WebServices/AddressWebService.svc/GetCountry),它可以正常工作。

如果我使用的是完全合格的 url,那么在转移到生产环境时将很难进行更改。虽然我们可以使用全局变量来存储 webroot(在本例中为 c2c)

有没有什么简单的办法可以解决这个问题,我也在config文件中给出了基地址

<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> 

【问题讨论】:

    标签: asp.net wcf rest


    【解决方案1】:

    您需要获取调用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 });
      }
    }
    

    我认为这应该可行。我没有在一个经过测试的、可行的例子中提出它,但你明白了它的要点。

    【讨论】:

    • 波浪号 URI 前缀是 ASP.NET 特定的东西,并且 OP 没有使用 ASP.NET,所以如果这可行,我会感到惊讶。
    • 它尝试解析页面/控件的url,即使它不解析url
    【解决方案2】:

    尝试将您的基址更改为尾部斜杠。例如

             <baseAddresses>
                 <add baseAddress="http://localhost:81/c2c/"/>
             </baseAddresses>
    

    【讨论】:

    • 它没有检索到虚拟文件夹名称
    【解决方案3】:

    您的整个站点是否在本地的/c2c/ 虚拟路径中,用于本地主机测试,但将在生产环境中部署为在/ 处运行?如果是这样,最简单的做法是让您的 localhost 环境匹配生产环境(即从本地 IIS 路径中删除 /c2c/)。

    如果不是,并且/c2c/ 是一切都将投入生产的地方,那么在您的jQuery 代码中使用/c2c/WebServices/AddressWebService.svc/GetCountry 之类的URL 就足够合理了。即使您需要更改它们,搜索/替换 url: "/c2c/ => url: "/ 也是一种相对安全/容易的重构。

    【讨论】:

    • 谢谢戴夫。这真的很有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2010-11-26
    相关资源
    最近更新 更多