向C# WCF Service传递文件数据返回400 Bad Request错误如何解决
问题根因
你遇到的400错误和无法进入调试的问题完全匹配报错日志描述:
- WCF服务的
CaricaDocumentoCompilato接口入参为Stream类型,默认要求入站请求的消息体格式为Raw原始二进制格式,不支持结构化JSON格式入参 - 前端当前调用将文件流封装到了
{stream: _stream}的JSON结构中提交,请求Content-Type为application/json,WCF识别到消息格式和要求的Raw不匹配,会直接抛出错误,不会进入接口方法逻辑,因此调试断点无法触发。
解决方案
推荐优先选择改动量最小的前端适配方案,也可根据业务需要选择服务端配置方案。
方案1:前端调整为直接提交原始流(推荐)
不需要修改服务端代码,只需调整前端调用逻辑:
- service层post请求的请求体直接传文件流,不要包裹为JSON对象
- 手动设置请求头
Content-Type为application/octet-stream(或文件对应实际MIME类型)
修改后的service层代码示例:
result.caricaDocumentoCompilato = function(_stream) { var self = this; return $q( function(resolve, reject) { try { remoteService .post(EasyWork.SERVER_LINK + '/json/CaricaDocumentoCompilato', _stream, true, { 'Content-Type': 'application/octet-stream' }) .then( function(res) { resolve(res); }, function(error) { console.error('caricaDocumentoCompilato ERRORE -> ' + error.message); reject(error); } ) } catch (error) { console.error('caricaDocumentoCompilato ERRORE -> ' + error.message); reject(error); } } ); }
注:如果需要传递额外参数,可将参数放在URL的QueryString中,请求体仅保留文件流内容。
方案2:服务端配置支持JSON格式请求(需保留前端JSON封装时选择)
通过自定义WebContentTypeMapper让WCF将JSON请求识别为Raw格式处理:
- 自定义ContentTypeMapper类:
public class RawContentMapper : WebContentTypeMapper { public override WebContentFormat GetMessageFormatForContentType(string contentType) { // 所有入站请求统一按Raw格式处理 return WebContentFormat.Raw; } }
- 修改WCF配置文件,绑定自定义Mapper:
<system.serviceModel> <bindings> <webHttpBinding> <binding name="RawStreamBinding" contentTypeMapper="你的命名空间.RawContentMapper, 你的程序集名称" maxReceivedMessageSize="10485760" maxBufferSize="10485760"> <!-- 按文件大小调整阈值,单位为字节 --> </binding> </webHttpBinding> </bindings> <services> <service name="你的服务实现类完整名称"> <endpoint address="" binding="webHttpBinding" bindingConfiguration="RawStreamBinding" contract="你的服务接口完整名称" behaviorConfiguration="webHttp"/> </service> </services> </system.serviceModel>
注:该方案下接口收到的Stream是完整JSON请求的字节流,需要自行反序列化JSON,提取其中的stream字段内容再做后续处理。
额外注意事项
- 传输超过64KB的文件时,需要同步调整WCF绑定配置中的
maxReceivedMessageSize、maxBufferSize参数,避免触发大小限制报错 - 生产环境建议配置文件大小校验,避免恶意大流量请求攻击
内容的提问来源于stack exchange,提问作者Luigi Del Buono
相关产品推荐
相关产品推荐

