我编写了一个由外部API调用的REST WCF服务。该请求正在ISO-8859-1中发送XML POST请求。这会导致我的服务收到400错误的请求响应。
这是我的服务方法的存根:
[OperationContract]
[WebInvoke(Method ="POST", UriTemplate="/", RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
[FaultContract(typeof(String))]
XmlElement GetInstructions(XmlElement request);
目前,我正在尝试拦截请求并返回相应的内容类型:
public class XmlContentTypeMapper : WebContentTypeMapper
{
public override WebContentFormat GetMessageFormatForContentType(string contentType)
{
return WebContentFormat.Xml;
}
}
仅当我从标题中删除charset = ISO-8859-1时才有效。
我见过使用IClientMessageInspector和IDispatchMessageInspector的例子,但这些似乎特定于SOAP,除非我遗漏了什么。
我该怎么做才能解决这个问题?我对传入的请求没有任何控制权。
感谢您的任何见解。
这是XML请求的第一部分:
POST http://localhost:54814/autocallerid.svc HTTP/1.1
Host: localhost:54814
Content-Type: text/xml, charset=ISO-8859-1
Content-Length: 1734
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="urn:oasis:names:tc:xacml:2.0:context:schema:os">
<Subject SubjectCategory="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
....
答案 0 :(得分:1)
好。我解决了这个问题。
我只需要将输入类型从XmlElement更改为Stream并将格式返回为WebContentFormat.Raw。
像这样:
[OperationContract]
[WebInvoke(Method ="POST", UriTemplate = "/info", BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
[FaultContract(typeof(String))]
XmlElement GetInstructions(Stream request);
而且:
public class XmlContentTypeMapper : WebContentTypeMapper
{
public override WebContentFormat GetMessageFormatForContentType(string contentType)
{
return WebContentFormat.Raw;
}
}