现有的客户端很多,改变它们是不可行的。
我已经成功地创建了一个服务,它在大多数客户机上都有一个令人烦恼的异常。
因为旧的服务是SOAP1.1,所以我尝试使用一个basicHttpBinding,比如:
<bindings>
<basicHttpBinding>
<binding name="Whatever" />
</basicHttpBinding>
</bindings>
POST http://MySoapWebServiceUrl/Service.svc HTTP/1.1
SOAPAction: DoSomething
Content-Type: text/xml;charset=UTF-8
Content-Length: 1234
Host: MySoapWebServiceUrl
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<xml:InputStuffHere />
</soap:Body>
</soap:Envelope>
但是,我在这两个绑定中找不到一个设置组合,可以同时允许“application/xml”和“text/xml”的内容类型,并在标题中使用SOAP1.1样式的“soapaction”寻址。
我还尝试实现一个自定义文本消息编码器,从Microsoft的WCF示例CustomTextMessageEncodingElement
开始。
但是,使用自定义文本消息编码器,我可以将mediatype
设置为'application/xml'或'Text/xml'。但是,毫不奇怪,发送指定内容类型的客户端成功,而使用其他内容类型的客户端失败。
我相信我想做的是根本不可能的。
我得出的结论是,WCF对于实现向后兼容替换遗留SOAP web服务来说是一种不合适的技术,遗留SOAP web服务允许在头部中包含各种内容类型值。
相反,我使用System.web.IHttpModule实现了一个自定义HttpModule。
public class MyCustomHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += OnBegin;
}
private void OnBegin(object sender, EventArgs e)
{
var app = (HttpApplication) sender;
var context = app.Context;
if (context.Request.HttpMethod == "POST")
{
string soapActionHeader = context.Request.Headers["SOAPAction"];
byte[] buffer = new byte[context.Request.InputStream.Length];
context.Request.InputStream.Read(buffer, 0, buffer.Length);
context.Request.InputStream.Position = 0;
string rawRequest = Encoding.ASCII.GetString(buffer);
var soapEnvelope = new XmlDocument();
soapEnvelope.LoadXml(rawRequest);
string response = DoSomeMagic(soapActionHeader, soapEnvelope);
context.Response.ContentType = "text/xml";
context.Response.ContentEncoding = Encoding.UTF8;
context.Response.Write(response);
}
else
{
//do something else
//returning a WSDL file for an appropriate GET request is nice
}
context.Response.Flush();
context.Response.SuppressContent = true;
context.ApplicationInstance.CompleteRequest();
}
private string DoSomeMagic(string soapActionHeader, XmlDocument soapEnvelope)
{
//magic happens here
}
public void Dispose()
{
//nothing happens here
//a Dispose() implementation is required by the IHttpModule interface
}
}
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="MyCustomHttpModule" type="AppropriateNamespace.MyCustomHttpModule"/>
</modules>
</system.webServer>
我试图使用独立的应用程序使用WCF web服务。我可以使用Internet Explorer查看此服务,也可以在Visual studio服务引用中查看。 这就是我得到的错误 如何更改它以使用正确的内容类型? 这是我的配置文件 这是堆栈
我创建了WCF服务,该服务将由需要接受内容类型application/xml;charset=UTF-8和SOAP1.1信封命名空间的第三方使用。该服务当前正在接受text/xml;charset=utf-8。不允许客户端更改内容类型。 我没有对web.config文件做任何更改,除了设置basicHttpBinding MaxReceivedMessageSize。
我在与Java WS对话时遇到了问题。我使用“WSHTTPBinding”绑定客户端证书进行身份验证,消息编码设置为“text”,.NET framework为4.0。服务器端是Java,我无法控制它。连接是通过Fiddler代理的(这就是我在网上看到请求的方式,比跟踪“System.NET”更加用户友好)。 我得到的例外情况如下: 服务器接受请求的“text”和“mtom”消息编码,响应总是相同
问题内容: 使用firebug时,我在asp.net mvc 4项目中收到此有线错误“ NetworkError:415无法处理… xt / xml; charset = utf-8’– ”。 代码: 服务代码: 该接口是: 和网络配置,我在WCF中使用了无文件: 问题答案: 您需要使用,而不是代码中的常规。这将为端点配置适当的绑定()和行为()以遵守该属性。
我在和Java WS对话时遇到了问题。我使用“wshttpbinding”绑定与客户端证书进行身份验证,消息编码设置为“text”,.NET framework为4.0。服务器端是Java,我无法控制它。连接是通过Fiddler代理的(这就是我在线上看到请求的方式,比跟踪“System.NET”用户友好得多)。 我得到的例外是: 在我阅读的所有文档中,返回的响应介于常规SOAP消息和MTOM消息之
我有一个支持json和XML的REST api。我想测试XML方面,但自从升级到2.4.0版本后,我得到了一个错误: 预期的内容类型“xml”与实际的内容类型“application/json”不匹配。