我通过wsdl.exe
- 网址WSDL
创建了一个C#代理类。我在Web应用程序的上下文中使用此代理类,我无法控制(因此无法更改web.conf
或类似内容)。我也无法改变我正在谈论的网络服务中的任何内容。
调用Web服务时,收到以下异常:
Client found response content type of 'multipart/related; type="application/xop+xml";
boundary="uuid:5c314128-0dc0-4cad-9b1a-dc4a3e5917bb"; start="<root.message@cxf.apache.org>";
start-info="application/soap+xml"', but expected 'application/soap+xml'.
据我所知,这是Web服务使用MTOM的问题。现在我想告诉我的班级接受MTOM,但我发现的只是web.conf
中的配置。
代理类派生自SoapHttpClientProtocol
,看起来像这样(相关部分):
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name = "myrequestSoapBinding", Namespace = "http://namespace.of.company.of.webservice/")]
public class myrequest : System.Web.Services.Protocols.SoapHttpClientProtocol
{
public myrequest(string url)
{
this.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12;
this.Url = url;
}
[return: System.Xml.Serialization.XmlElementAttribute("return", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, DataType = "base64Binary")]
public byte[] getDocuments([System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, DataType = "base64Binary")] byte[] input)
{
try
{
object[] results = this.Invoke("getDocuments", new object[] {
input});
return ((byte[])(results[0]));
}
catch (Exception ex)
{
var realResponse = StripResponse(ex.Message);
return Encoding.UTF8.GetBytes(realResponse.ToString());
}
}
}
try ... catch
中的getDocuments
是一个hacky解决方法,可以从异常Message
中获取“真正的”服务响应 - 这实际上并不是我想要实现的方式。
所以我的问题是:有没有办法更改代理类中的绑定以接受MTOM
响应?
答案 0 :(得分:1)
通过我努力提供帮助的少量研究,看来如果你 可以访问网络配置(我知道你不会这样做)并且您打开MTOM然后Visual Studio将生成两个代理类:
WebServicesClientProtocol实现能够接受MTOM。要让WSDL创建一个派生自WebServicesClientProtocol的代理,请遵循top of this MSDN article中的注释。
希望这可以解决问题。