解决WCF寄宿于WINFORM的跨域请求问题

本文介绍了在WCF服务寄宿于Winform应用中,处理跨域请求时遇到的问题及解决方案。当使用POST请求且请求体较长时,因Content-Type不匹配导致请求失败。通过设置WCF服务行为,以及实现IDispatchMessageInspector接口来拦截并处理OPTIONS请求,添加Access-Control-Allow-Origin头,最终成功解决跨域POST请求。同时提醒注意POST请求可能的长度限制,需要设置transferMode为Buffered。
摘要由CSDN通过智能技术生成

 

本人在项目中遇到的问题是这样的:

WCF服务寄宿于Winfrom应用程序,通过

public ServiceHost host = new ServiceHost(typeof(ByuWCFService.ByuDataService));

host.Open();

的方式来开启WCF服务,[OperationContract]等等的一系列注解实现了前端ajax请求访问服务端访问WCF服务;然后问题就来了:跨域

常见的方式,前端jsonp,这个方式虽能解决,但在浏览器中检查时,发现无论你type为get还是post,浏览器会自动识别为get,所以服务端接收到的是GET请求

[WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]足以

但如果请求体过长,超过1024个字节就不得不用POST请求,这时就不能用jsonp了,后端也得用

[WebInvoke(UriTemplate = "UpdatEemployeetable", Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]

的方式。

因为RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest的原因,将无法识别前端默认的ContentType为application/x-www-form-urlencoded的类型。所以前端ajax得加上contentType:'application/json',这样一个属性。加上这个属性之后浏览器会把这个请求识别为复杂请求,request header中会加上Origin:*****的属性,会在正式请求之前发送一个OPTIONS检测请求,如果这个请求不通过的话是不会发送后续的POST请求。

实现过程中走过的弯路:

1、

[WebInvoke(UriTemplate = "WebUpdatEemployeetable", Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]

string WebUpdatEemployeetable(string userId, string userPw, string groupCompanyId, string master, string slaveEmployeeDuty, string slaveWarehouseDuty, string database);

[WebInvoke(UriTemplate = "WebUpdatEemployeetable", Method = "OPTIONS", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]

void WebUpdatEemployeetable();

重载的方式接收OPTIONS请求,实践过程中发现OPTIONS请求是返回200了,但POST请求还是没发,原因,OPTIONS请求的Response Header中不存在Access-Control-Allow-Origin属性。

2、通过winform的配置文件app.config

添加

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值