2010-07-30 71 views
3

比方說,我指定了以下WCF REST服務地址「http://localhost/MyRESTService/MyRESTService.svc在WCF REST服務中通過POST發送參數的正確URI是什麼?

[ServiceContract] 
public interface IMyRESTService 
{ 
[OperationContract] 
[WebInvoke(
    Method = "POST", 
    UriTemplate = "/receive")] 
string Receive(string text); 

現在我可以調用提琴手我的REST的服務使用的地址「http://localhost/MyRESTService/MyRESTService.svc/receive」和它的作品(我會得到一個返回值)。

但是如果我想將參數發送到我的REST服務呢?我應該改變我的接口定義看起來像這樣:

[ServiceContract] 
public interface IMyRESTService 
{ 
[OperationContract] 
[WebInvoke(
    Method = "POST", 
    UriTemplate = "/receive/{text}")] 
string Receive(string text); 

現在,如果我將使用的地址「http://localhost/MyRESTService/MyRESTService.svc/receive/mytext」它的工作原理(發送參數「mytext的內容」,我會得到調用REST服務的提琴手一個返回值)。那麼這是通過POST發送參數的正確URI嗎?

讓我感到困惑的是,當我發送參數時,我不知道如何在代碼中完全使用此URI。我有以下代碼幾乎完成發送POST數據到WCF REST服務,但我堅持如何將參數考慮到URI。

Dictionary<string, string> postDataDictionary = new Dictionary<string, string>(); 
     postDataDictionary.Add("text", "mytext"); 

     string postData = ""; 
     foreach (KeyValuePair<string, string> kvp in postDataDictionary) 
     { 
     postData += string.Format("{0}={1}&", HttpUtility.UrlEncode(kvp.Key), HttpUtility.UrlEncode(kvp.Value)); 
     } 
     postData = postData.Remove(postData.Length - 1); 

     Uri uri = new Uri("http://localhost/MyRESTService/MyRESTService.svc/receive"); 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); 
     req.Method = "POST"; 
     byte[] postArray = Encoding.UTF8.GetBytes(postData); 
     req.ContentType = "application/x-www-form-urlencoded"; 
     req.ContentLength = postArray.Length; 

     Stream dataStream = req.GetRequestStream(); 
     dataStream.Write(postArray, 0, postArray.Length); 
     dataStream.Close(); 

     HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 
     Stream responseStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(responseStream); 

     string responseString = reader.ReadToEnd(); 

     reader.Close(); 
     responseStream.Close(); 
     response.Close(); 

如果我要發送的參數(如 「mytext的」)在通過POST代碼應URI代碼是要麼

Uri uri = new Uri("http://localhost/MyRESTService/MyRESTService.svc/receive"); 

或本(這工作,但它沒有任何意義,因爲參數應該以其他方式添加,而不是直接添加到URI地址)

Uri uri = new Uri("http://localhost/MyRESTService/MyRESTService.svc/receive/mytext"); 

我是很高興如果你能幫助我,WCF REST服務不會如此困難。

回答

4

所以,如果你想發送XML等原始數據到你的WCF REST服務(也返回),下面是如何做到這一點。但是我不得不說,在我找到這個解決方案之前,我花了很多時間搜索,因爲所有的例子都只是談論在URI中發送參數(來吧,常見的情況是發送XML,而你不能正確地做到這一點在URI中)。最後,當我找到正確的代碼示例時,發現它在WCF中不夠用,因爲我收到了錯誤「400 Bad Request」。這個錯誤是由於WCF不能使用我的原始XML這一事實造成的,如果我不強迫它使用一些自定義代碼來重寫它(來吧,你在想什麼微軟?,在下一個.NET版本中修復這個錯誤框架)。所以如果做這樣一件基本的事情可能如此艱難和耗時,我一點也不滿意)。

** IMyRESTService.cs(服務器端代碼)**

[OperationContract] 
[WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)] 
Stream Receive(Stream text); 

**客戶端代碼**

XmlDocument MyXmlDocument = new XmlDocument(); 
MyXmlDocument.Load(FilePath); 
byte[] RequestBytes = Encoding.GetEncoding("iso-8859-1").GetBytes(MyXmlDocument.OuterXml); 

Uri uri = new Uri("http://localhost/MyRESTService/MyRESTService.svc/Receive"); 

Request.ContentLength = RequestBytes.Length; 

Request.Method = "POST"; 

Request.ContentType = "text/xml"; 

Stream RequestStream = Request.GetRequestStream(); 
RequestStream.Write(RequestBytes, 0, RequestBytes.Length); 
RequestStream.Close(); 

HttpWebResponse response = (HttpWebResponse)Request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream()); 
string ResponseMessage = reader.ReadToEnd(); 
response.Close(); 

** XmlContentTypeMapper.cs(服務器端的自定義代碼這迫使WCF接受原始XML)**

public class XmlContentTypeMapper : WebContentTypeMapper 
{ 
public override WebContentFormat GetMessageFormatForContentType(string contentType) 
{ 
return WebContentFormat.Raw; 
} 
} 

** Web。配置(用於利用所述自定義代碼的服務器端的配置設置)

<endpoint binding="customBinding" bindingConfiguration="XmlMapper" contract="MyRESTService.IMyRESTService" 
      behaviorConfiguration="webHttp" /> 

<bindings> 
    <customBinding> 
    <binding name="XmlMapper"> 
     <webMessageEncoding webContentTypeMapperType="MyRESTService.XmlContentTypeMapper, MyRESTService"/> 
     <httpTransport manualAddressing="true"/> 
    </binding> 
    </customBinding> 
</bindings> 

調用使用HTTP POST http://social.msdn.microsoft.com/forums/en-us/wcf/thread/4074F4C5-16CC-470C-9546-A6FB79C998FC

+0

我得到這個(「400」)err味精,但只有從運行較舊(精簡版)的.NET的手持設備調用時。就我而言,至少,我不認爲需要對服務器進行更改,因爲我的代碼可以從「當代」客戶端項目(在VS 2013中創建的Winforms應用程序)中正常工作, – 2014-08-29 23:39:19

2

一個WCF Web服務我有同樣的問題,並且使用招,我接到403(錯誤的請求)錯誤每次我試圖張貼使用正文。我花了幾個小時才找到的Fix是將內容類型更改爲application/xml,並將該主體作爲Xml發送。

這是我在標題中使用的提琴手行:

Content-Type: application/xml;charset=UTF-8 

現在我還沒有使用Microsoft.Http庫,在我的客戶我用的WebRequest做的帖子,並通過設置內容類型爲:

request.ContentType = "application/xml;charset=UTF-8"; 

對我來說工作很好。

現在,如果您想使用URI發送參數,我推薦使用WebGet而不是WebInvoke和POST。

相關問題