我有一个包含SOAP和REST端点的Web服务。我必须接受来自客户端的请求,即我对我的REST端点没有任何控制权。目前,客户端获得400响应,我服务器上的tracelog显示此错误:
The incoming message has an unexpected message format 'Raw'.
The expected message formats for the operation are 'Xml', 'Json'.
我已经尝试了所有我能想到的WebContentTypeMapper,但似乎最终我每次都开始。来自客户端的请求似乎不是格式良好的XML或JSON,因此如果我尝试从WebContentTypeMapper强制使用XML或JSON类型,我最终会出现解析器错误。
所以我想我需要找出是否可以强制此端点接受该消息。这应该很容易,对吧? ...家伙?是吗?
答案 0 :(得分:8)
如果您使操作成为流,那么您可以自己分析传入的数据并找出如何处理它。 HTTP请求的ContentType应该告诉您流中的内容
例如,假设您有一项允许您上传图片的服务。您可能希望根据图像类型执行不同类型的图像处理。所以我们有一份服务合同如下:
[ServiceContract]
interface IImageProcessing
{
[OperationContract]
[WebInvoke(Method="POST", UriTemplate = "images")]
void CreateImage(Stream stm);
}
实现检查请求的内容类型并执行依赖于它的处理:
public void CreateImage(Stream stm)
{
switch(WebOperationContext.Current.IncomingRequest.ContentType)
{
case "image/jpeg":
// do jpeg processing on the stream
break;
case "image/gif":
// do GIF processing on the stream
break;
case "image/png":
// do PNG processing on the stream
break;
default:
throw new WebFaultException(HttpStatusCode.UnsupportedMediaType);
}
}
答案 1 :(得分:0)
我的理解是REST需要JSON或XML,请点击此处:
WCF(Windows Communication Foundation)是新标准 使用.NET和REST构建服务(REpresentational State Transfer) 在构建服务时不仅仅是一种非常流行的技术 在.NET领域。通过服务,您可以传输序列化数据 要使用的管道,有一些序列化方法:
Binary:不适用于REST服务,但提供最小的数据包 尺寸。每一端都必须明确知道如何处理数据。
SOAP:Web服务的长期运行标准。非常具有描述性, 但是由于元数据量的原因,数据包的大小非常大。
XML(POX):Plain Old XML仅提供具有结构的数据 没有元数据会留下较小的数据包大小。
JSON(JavaScript Object Notation):一种新的即将推出的标准 类似于简单XML提要的数据包大小,但可以直接使用 JavaScript使其成为使用服务时的最佳选择 jQuery的。