最简单的带流的RESTful WCF服务调用



我想创建一个具有以下属性的web服务:

    它使用WCF和。net 4.0
  • 托管于IIS7
  • 这是RESTful
    • 可以保留收集和处理WebFaultExceptions等的默认输出行为
  • 它有一个调用
    • 读取潜在的巨大二进制文件的裸HTTP POST(最好不要保存在内存中!)
    • 接受流作为输入
    • 输出一个流
    • 使用一个UriTemplate进行匹配(很快会有更多的调用)
    • 希望流完全是原始的,而不是让IIS或WCF尝试通过以任何方式处理内容类型来智能
问题是IIS和/或WCF一直在干扰Content-Type,坚持返回
415 Cannot process the message because the content type '...' was not the expected type 'text/xml; charset=utf-8'

,不管内容类型是什么。你能指出我在下面犯的错误吗?

[ServiceContract]
public interface IRenderService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/render", BodyStyle = WebMessageBodyStyle.Bare)]
    Stream Render(Stream input);
}

使用以下Web.config中的片段:

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="500000000" />
</system.web>
<system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding
              name="FileStreamConfiguration"
              transferMode="Streamed"
              maxReceivedMessageSize="500000000"
              maxBufferSize="500000000"
              openTimeout="00:25:00"
              closeTimeout="00:25:00"
              sendTimeout="00:25:00"
              receiveTimeout="00:25:00" />
        </webHttpBinding>
    </bindings>
    <services>
        <service name="RenderService" behaviorConfiguration="RenderServiceBehavior">
            <endpoint address="" binding="webHttpBinding" contract="RenderServer.IRenderService" bindingConfiguration="FileStreamConfiguration" behaviorConfiguration="RenderEndpointBehaviour" >
                <identity>
                    <dns value="localhost"/>
                </identity>
            </endpoint>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="RenderServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="RenderEndpointBehaviour">
                <webHttp/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
</system.serviceModel>

我想总是得到HTTP POST主体的原始内容,并从WebOperationContext.Current.IncomingRequest手动获取报头,如果我认为有必要的话,IIS/WCF应该完全忽略请求的所有方面,除了解析它并将其发送到我的代码。我将使用WebOperationContext.Current.OutgoingResponse设置我认为合适的输出方面,也是手动设置。

使用新的WCF Web API库很容易做到这一点。请参阅http://wcf.codeplex.com我的博客上有一个示例,我将在电源恢复后发布:-)

界面是这样的,

[ServiceContract]
public interface IRenderService{
    [WebInvoke(Method = "POST", UriTemplate = "/render")]
    HttpResponseMessage Render(HttpRequestMessage input);
}

相关内容

  • 没有找到相关文章

最新更新