㈠ WCF中的幾種地址總結
本文就從WebService定址開始,總結一下WCF中的幾種地址。 目錄:WebService定址
邏輯地址與物理地址
基地址、相對地址、絕對地址
1、WebService定址與以協議無關的SOAP作為消息的載體在被客戶端發往服務端以後就不再由客戶端所控制了。如果以HTTP將SOAP從客戶端發往服務端,通過HTTP協議的標准動作如Get、Post進行操作,服務處理完畢以後再通過HTTP響應發往客戶端這樣一次交互就完成了。可事實上,SOAP沒有標准方法來指定消息的目的地址、如何返回響應以及錯誤在哪等。如果消息交互變得復雜一點,這種問題就無法解決。如:由客戶端發出去的消息需經過多個服務路由處理。WebService定址規范正是為了解決這些問題。在WebService定址規范中有兩個重要的概念:終結點應用、消息報 頭。它可以用於在WebService中傳達Service Endpoint所需要的信息,也可為消息在WebService間傳送提供地址。 如下所示顯示終結點應用所需的信息集
xs:anyURI
... ?* 在終結點應用所需的信息集中只有xs:anyURI是必須的,其他幾個都是可選的。 消息報頭:它是WebService定址中定義了一些標準的SOAPHeader,它擴展並添加到SOAPHeader中。2、邏輯地址與物理地址物理地址是ServiceEndpoint的ListenUri屬性指明的值,也就是監聽地址;邏輯地址則是終結點地址,即EndpointAddress,即SOAP消息的"To"指向的地址。public class ServiceEndpoint{// Fields private EndpointAddress address;
private Uri listenUri;
private ListenUriMode listenUriMode;
//其他屬性} WCF客戶端與服務端交互是通過物理地址,即監聽地址實現的。在WCF中,服務通過物理地址在制定的位置監聽傳入的消息。在WCF配置中,元素中address屬性指定的即為邏輯地址;listenUri指定物理地址。除非通過listenUri指定,一般邏輯地址與物理地址是相同的。 如果服務端配置了物理地址,在客戶端通過ClientViaBehavior告之Client服務端所使用的物理地址。Server端配置如下: Client端配置如下: 使用物理地址,客戶端通過與服務端相同的物理地址發送消息。那麼邏輯地址有什麼用呢。
㈡ WCF REST的POST時候報400錯誤是怎麼回事
Get方法可以正常返回值,POST方法提示:遠程伺服器返回錯誤: (400) 錯誤的請求。
服務端代碼如下:
[ServiceContract] [(RequirementsMode = Mode.Allowed)] [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class RestService { [WebInvoke(UriTemplate = "Create", Method = "POST")] public string Create(string s) { return s; } [WebGet(UriTemplate = "Get?id={id}",RequestFormat = WebMessageFormat.json)] public SampleItem Get(string id) { return new SampleItem {Id = 1, StringValue = "http://s.yanghao.org/program/test"}; } }
客戶端調用代碼如下:
WebClient webClient = new WebClient();webClient.Encoding = System.Text.Encoding.UTF8;webClient.Headers[HttpRequestHeader.ContentType] = "application/json";string tt = webClient.DownloadString("http://localhost:7000/RestService/Get?id=tt");Console.WriteLine(tt);WebClient client=new WebClient();client.Encoding = System.Text.Encoding.UTF8;client.Headers[HttpRequestHeader.ContentType] = "application/json";//下一行報錯client.UploadString(new Uri("http://localhost:7000/RestService/Create", UriKind.Absolute), "POST", "test");
次瀏覽