我想创建一个具有以下属性的web服务:
- 它使用WCF和。net 4.0
- 托管于IIS7
- 这是RESTful
- 可以保留收集和处理WebFaultExceptions等的默认输出行为
- 它有一个调用
- 读取潜在的巨大二进制文件的裸HTTP POST(最好不要保存在内存中!)
- 接受流作为输入
- 输出一个流
- 使用一个UriTemplate进行匹配(很快会有更多的调用)
- 希望流完全是原始的,而不是让IIS或WCF尝试通过以任何方式处理内容类型来智能
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);
}