我一直在用這種方式敲打我的牆頭兩天,希望有人能幫我一把。我擁有的是使用WCF編寫的RESTful Web服務;沒有什麼是真的只有兩種方法接受單個字符串參數,並且還返回一個字符串。參數和返回值都是直線XML。REST風格的WCF服務在發送「原始」XML時返回400代碼
[ServiceContract]
public interface IService
{
[OperationContract]
[WebGet(UriTemplate = "/method1/{data}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml)]
string Method1(string data);
[OperationContract]
[WebGet(UriTemplate = "/method2/{data}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml)]
string Method2(string data);
}
對於參數的緣故可以說,這兩種方法的實現看起來是這樣的:
public string Method1(string data)
{
return string.Format("You entered: {0}", data);
}
如果我轉到HTTP://myuri.com/service.svc/method1/
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">You
entered: foo</string>
這個偉大的工程,但如果我改變的URL:HTTP://myuri.com/service.svc/method1/ <富>我得到一個400(壞FOO是寫給瀏覽器進行以下請求)。所以我使一些示蹤劑看到使用下面的代碼是怎麼回事:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\Traces.svclog" />
</listeners>
</source>
</sources>
正如你可以看到我使用的開關值「全部」捕捉每一個這樣的執行過程中發生的事件服務。我使用URL格式重新運行了幾次,以驗證示蹤劑是否正在運行。然後我去了包含XML標籤foo的URL,並按照預期收到了400錯誤,但是當我回到日誌文件時,沒有在其末尾添加其他信息。這導致我相信在調用WCF服務之前顯示400錯誤。
最後,我將方法從'GET'方法切換到'POST'方法,使用WebRequest/WebResponse編寫了一些代碼,結果相同。現在我已經閱讀了一些關於在客戶端使用XmlSerializer將數據發送到服務的文章,但這違背了此服務的目的。當我使用.NET編寫服務時,很可能PHP或傳統ASP腳本將連接到此服務,並且顯然,它們無法訪問XmlSerializer。
所以我的百萬美元的問題是這樣的:是否可以向WCF中開發的RESTful Web服務發送一個'原始'XML請求,如果是這樣,怎麼辦?
P.S. 進出服務的XML不是基於任何有形的對象,它僅僅是我創建的與此服務一起使用的結構。進入的XML通過XPath進行分析,將值放入更大的XML字符串中,並傳遞給外部API。該API的結果將被處理,然後由我的RESTful服務返回。
任何幫助將不勝感激!
您提到的線程包含調用WCF服務的所有可能方法的描述,它非常棒。基本上我通過WebInvoke通過RESTful實現了簡單的XML請求。 WebGet是使用GET的REST,您也可以支持JSON響應,更像MVC 4中的Web API。 – 2012-10-10 09:23:13
由於您現在直接在請求元素中發送XML,是不是會限制您可以發送的xml的大小? – evilfish 2013-06-19 05:59:32
我想,但是對於給定的解決方案,我從未遇到過這種情況。我想如果我遇到了一個問題,我可能會調整配置文件中的maxQueryStringLength來解決它。 – dparsons 2013-06-19 11:57:53