本人在项目中遇到的问题是这样的:
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
添加