You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向C# WCF Service传递文件数据返回400 Bad Request错误如何解决

问题根因

你遇到的400错误和无法进入调试的问题完全匹配报错日志描述:

  • WCF服务的CaricaDocumentoCompilato接口入参为Stream类型,默认要求入站请求的消息体格式为Raw原始二进制格式,不支持结构化JSON格式入参
  • 前端当前调用将文件流封装到了{stream: _stream}的JSON结构中提交,请求Content-Type为application/json,WCF识别到消息格式和要求的Raw不匹配,会直接抛出错误,不会进入接口方法逻辑,因此调试断点无法触发。
解决方案

推荐优先选择改动量最小的前端适配方案,也可根据业务需要选择服务端配置方案。

方案1:前端调整为直接提交原始流(推荐)

不需要修改服务端代码,只需调整前端调用逻辑:

  1. service层post请求的请求体直接传文件流,不要包裹为JSON对象
  2. 手动设置请求头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格式处理:

  1. 自定义ContentTypeMapper类:
public class RawContentMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        // 所有入站请求统一按Raw格式处理
        return WebContentFormat.Raw;
    }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:51:01