2012-09-06 40 views
2

我使用wsdl.exe生成代理類來請求可能在java平臺上構建的Web服務。問題在於響應的編碼。我得到'?' (例如'???? 26'而不是'АН26'我也使用soapUI,並且一切都很好。我沒有經驗配置.Net客戶端。所以我怎麼才能確定和配置適當的響應編碼。我已經使用app.config作爲下一個: soap響應編碼'?'所有字符串中的字符而不是俄語.Net代理,Java服務器(?)

我附上標題信息在這裏。

Accept-Encoding: gzip,deflate 
Content-Type: text/xml;charset=UTF-8 
SOAPAction: "urn:#DCSSci_ListFlight_5" 
Content-Length: 641 
Host: 109.73.1.66:23022 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 

響應頭:

HTTP/1.1 200 OK 
Date: Thu, 06 Sep 2012 03:47:52 GMT 
Server: Apache/2.2.10 (Linux/SUSE) 
200 OKX-FidelXML-Version: 2.0 
Content-length: 15464 
Keep-Alive: timeout=15, max=100 
Connection: Keep-Alive 
Content-Type: text/xml 

解決方案:

public class TraceExtension : SoapExtension 
{ 
    Stream oldStream; 
    Stream newStream; 
    public override Stream ChainStream(Stream stream) 
    { 
     oldStream = stream; 
     newStream = new MemoryStream(); 
     return newStream; 
    } 
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) 
    { 
     return null; 
    } 
    public override object GetInitializer(Type WebServiceType) 
    { 
     return null; 
    } 
    public override void Initialize(object initializer) 
    { 
    } 
    public override void ProcessMessage(SoapMessage message) 
    { 
     switch (message.Stage) 
     { 
      case SoapMessageStage.BeforeSerialize: 
       break; 
      case SoapMessageStage.AfterSerialize: 
       newStream.Position = 0; 
       Copy(newStream, oldStream); 
       break; 
      case SoapMessageStage.BeforeDeserialize: 
       message.ContentType = "application/soap+xml; utf-8"; 
       Copy(oldStream, newStream); 
       newStream.Position = 0; 
       break; 
      case SoapMessageStage.AfterDeserialize: 
       break; 
     } 
    } 
    void Copy(Stream from, Stream to) 
    { 
     TextReader reader = new StreamReader(from, System.Text.Encoding.GetEncoding("utf-8")); 
     TextWriter writer = new StreamWriter(to, System.Text.Encoding.GetEncoding("utf-8")); 
     writer.WriteLine(reader.ReadToEnd()); 
     writer.Flush(); 
    } 
} 

[AttributeUsage(AttributeTargets.Method)] 
public class TraceExtensionAttribute : SoapExtensionAttribute 
{ 
    private int priority; 
    public override Type ExtensionType 
    { 
     get { return typeof(TraceExtension); } 
    } 
    public override int Priority 
    { 
     get { return priority; } 
     set { priority = value; } 
    } 
} 

而不僅僅是增加

我不會在性反應的頭...... 請求頭撒尿編碼信息
[TraceExtension()] 
attribute for proxy invoke method 
+0

無法發佈一個答案,但問題就解決了。在6個小時內將發佈 – jk1

+0

任何更好的解決方案,歡迎 – jk1

回答

4

您可以覆蓋代理的GetWebResponse和更改編碼

public class YourProxyClass : SoapHttpClientProtocol 
{ 
    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     var response = base.GetWebResponse(request); 
     response.Headers["Content-Type"] = "text/xml; charset=utf-8"; //<== 
     return response; 

    } 
} 
+0

偉大工程,謝謝! – jk1

+0

好的提示,謝謝! –