2011-04-23 137 views
0

我在我的項目中創建了WCF REST樣式服務。在發展中,我能指定相對URL來訪問我的服務,WCF REST服務地址

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/GetCount ry),它工作正常。

如果我使用完全合格的網址,那麼在轉移到生產時很難做出更改。雖然我們可以使用全局變量來存儲根目錄(在這種情況下,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> 

回答

3

你需要獲得一個相對URL調用的方法ajax。通常我做的是

$.ajax({ url: "<%=ResolveUrl("~/Services/Service.asmx/ServiceMethod") %>" }); 

(很明顯,你需要的則params的其餘部分進行設置,這必須是在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 }); 
    } 
} 

我認爲這應該工作。我沒有提出一個經過測試的,可行的例子,但你明白了它的要點。

+0

tilde URI前綴是一個ASP.NET特定的事情,OP不使用ASP.NET,所以如果這能夠工作,它會讓我感到驚訝。 – 2011-04-23 13:03:06

+0

它試圖解析頁面/控件的url,即使它不能解析url – Idris 2011-04-24 03:59:47

0

嘗試更改您的基地址以產生尾部斜線。例如

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

它不會檢索虛擬文件夾名稱 – Idris 2011-04-24 04:00:16

0

是在/c2c/虛擬路徑你的整個網站在本地,本地主機測試,但將部署到在生產運行/?如果是這樣,最簡單的做法是讓你的本地主機環境匹配生產(即從本地IIS路徑中刪除/c2c/)。

如果不是,並且/c2c/是一切都將在生產中的地方,那麼在您的jQuery代碼中使用像/c2c/WebServices/AddressWebService.svc/GetCountry這樣的URL是足夠合理的。即使您需要更改它們,搜索/替換url: "/c2c/ =>url: "/是一個相對安全/輕鬆的重構。

+0

謝謝戴夫。這真的很有用 – Idris 2011-04-28 07:47:46