2009-06-11 60 views
1

使用Visual Studio 2008,我設置了一個使用Web服務的客戶端。 它與緩衝區大小無關(因爲這是一個典型的響應,所有適當的大小都增加了)。由於特殊字符(400)錯誤請求導致Web服務失敗

我正在使用List作爲Method的參數。 經過多次實驗後,我使用System.Net.WebClient手動創建Soap 1.1和Soap 1.2請求來測試結果。

using (var webCtx = new System.Net.WebClient()) 
{ 
    webCtx.Headers.Add(System.Net.HttpRequestHeader.ContentType, "text/xml"); 
    webCtx.Headers.Add("SOAPAction", "http://tempuri.org/HelloWorld"); 
    var uri = new Uri("http://localhost:12345/MyProject/WebService.asmx"); 
    MessageBox.Show(webCtx.UploadString(uri, xml)); 
} 

其中xml是帶有實際數據的xml的字符串變量。 問題是當其中一個字段有特殊字符時。這是xml消息主體的示例。

<PocoClass> 
    <UnicodeString>&#xE;123</UnicodeString> 
</PocoClass> 

如果UnicodeString的值是簡單的(即123),但是一旦特殊字符出現,我得到了400個錯誤請求。

現在,我發現了一個Microsoft知識庫文章,它描述了基本上指出的安裝hotfix的bug kb911276。這真的不是問題的解決方案,所以我想知道是否有任何想法來解決這個問題?

是唯一的解決方案來編寫某種自定義編碼/解碼或自定義綁定來實現的服務器和客戶端?有更簡單的想法嗎?

感謝

編輯: 使用一個List是不是一個問題,因爲它是由VS.處理這是一個更完整的(但仍然是部分)肥皂信息的內容。

<HelloWorld xmlns="http://tempuri.org/"> 
    <pocoList> 
    <PocoClass> 
     <UnicodeString>&#xE;123</UnicodeString> 
    </PocoClass> 
    </pocoList> 
</HelloWorld> 

回答

3

我有一個web服務類似的問題,我們的應用程序的用戶運行在線帳戶搜索。我發現一個VS Feedback item about this,但它似乎認爲這種行爲的設計。

我們最終做的是編寫一個方法來替換序列化爲帶有問號的XML時不允許的所有字符。

允許的列表爲:0x09,0x0a,0x0d,0x20-0xd7ff和0xe000-0xfffd。其他一切,我們轉向「?」。

我想如果你不能做到這一點,數據應該在運輸過程中base64編碼,以避免這個問題。對我來說似乎有點奇怪,因爲它打破了通過Web服務無損發送呼叫的能力。

0

我的問題是你在哪裏陳述你使用List作爲方法的參數。 Web服務不直接支持列表。你需要使用一個數組作爲參數。然後在內部,您可以使用.ToList()將其轉換爲列表。這可能不是你的問題直接!

+0

列表與T []對我意識到的ASMX中的序列化沒有影響。 – 2009-08-12 19:17:50

0

該知識庫文章指的是請求URL中的unicode字符集,而不是將實際數據發佈到服務器。

這就是說;我會確認你的頭文件格式正確。

此外,如果VS爲您生成客戶端代理;右鍵點擊服務參考,然後點「更新服務參考」

剛剛注意到一件事;你說你正在傳遞一個列表作爲參數;從所示的xml片段中看,這看起來不像是從列表(通過任何.NET xml序列化器)序列化的東西;如果你想使用webclient方法進行調試;嘗試驗證xml的格式是否有效。

0

你在哪裏看到&#xE;?在原始的XML或序列化的數據? XML被定義爲只包含人類可讀的字符,而&#xE;是不可讀的ASCII移出字符的XML實體。如果您正在查看原始XML並且它包含XML實體代碼,那麼這是允許的,但是如果您正在查看序列化數據,並且您的XML文檔包含原始控制字符,則它是無效的並將被拒絕。

相關問題