是否可以强制WCF REST端点接受Raw消息格式?

时间:2012-01-25 22:34:54

标签: .net vb.net wcf rest

我有一个包含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类型,我最终会出现解析器错误。

所以我想我需要找出是否可以强制此端点接受该消息。这应该很容易,对吧? ...家伙?是吗?

2 个答案:

答案 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 REST: XML, JSON or Both?

  

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的。