Javascript 不允许自托管WCF REST服务JSON POST方法
到目前为止,我已经在互联网上看到了数千个这样的“WCF”问题,但我开始认为这是不可能的。请有人告诉我我错了 背景:我正在使用一个自托管的WCF服务(因此Global.asax.cs在这里没有帮助)。端点也是通过编程方式定义的。契约是用WebInvoke(Method=“POST”)修饰的,我正在对服务进行JQuery调用 飞行前最初使用选项方法,但飞行后方法失败,不允许使用405方法。还可以让函数完美地工作 我已经在互联网上搜索和试验了大约一个月了,它不会改变。此服务已对通过TCP调用它的另一个客户端做出良好响应。。。请一些天才帮我一下。谢谢 PS:我觉得帖子的回复很奇怪,是允许:选项。。。那肯定不应该存在吗 CORSJavascript 不允许自托管WCF REST服务JSON POST方法,javascript,c#,jquery,json,wcf,Javascript,C#,Jquery,Json,Wcf,到目前为止,我已经在互联网上看到了数千个这样的“WCF”问题,但我开始认为这是不可能的。请有人告诉我我错了 背景:我正在使用一个自托管的WCF服务(因此Global.asax.cs在这里没有帮助)。端点也是通过编程方式定义的。契约是用WebInvoke(Method=“POST”)修饰的,我正在对服务进行JQuery调用 飞行前最初使用选项方法,但飞行后方法失败,不允许使用405方法。还可以让函数完美地工作 我已经在互联网上搜索和试验了大约一个月了,它不会改变。此服务已对通过TCP调用它的另一个
public class CORSEnablingBehavior : BehaviorExtensionElement, IEndpointBehavior
{
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
var requiredHeaders = new Dictionary<string, string>();
requiredHeaders.Add("Access-Control-Allow-Origin", "*");
requiredHeaders.Add("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
requiredHeaders.Add("Access-Control-Allow-Headers", "Origin, Cache-Control, Connection, Pragma, Content-Length, Content-Type, Accept, Accept-Encoding, Accept-Language, Host, User-Agent");
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CORSHeaderInjectingMessageInspector(requiredHeaders));
}
JQuery
jQuery.ajax({
跨域:是的,
类型:“POST”,
contentType:“应用程序/json”,
url:“http://localhost:8086/CustomerService/rest/GetCustomerRelational/",
数据:JSON.stringify({
《clientHandle》:1824年,
“customerID”:“ABB029”,
“loadRelationalData”:真
}),
数据类型:“json”,
成功:功能(结果){
console.log(“成功…”);
document.getElementById(“lblResponse”).innerHTML=“成功:”+JSON.stringify(result.NormalResult);
},
错误:函数(x,s,t){
日志(“错误…”);
document.getElementById(“lblResponse”).innerHTML=x.responseText;
}
});代码>
我想出来了
这个WCF和其他人的WCF之间的主要区别在于,我的WCF是自托管的,而其他所有东西都托管在IIS上(大部分)
多亏了这篇文章,答案就在于拦截了飞行前的请求。IIS承载的WCF要求在global.asax文件中执行拦截,如下所示:
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
//These headers are handling the "pre-flight" OPTIONS call sent by the browser
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE,OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
HttpContext.Current.Response.End();
}
}
但是,这在自托管WCF中是不可能的。但是,我们仍然可以使用app.config中的这一行使用ASP.NET功能
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
我意识到仅仅将其设置为“允许”并没有帮助,它必须是“必需的”
最后,为了启动飞行前,接口和服务中需要有以下代码:
[OperationContract]
[FaultContract(typeof(ValidationFault))]
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
void GetOptions();
public void GetOptions()
{
WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
}
现在,具有复杂参数的POST方法将通过飞行前测试,并执行带有响应的方法。据我所知,jsonp(crossDomainScriptAccessEnabled选项)不适用于POST
如果有人问起,我已经遵循了以下教程,并感谢Eser,我是如此绝望,我无论如何都尝试了…但是,这在自托管WCF中是不可能的
-->WebOperationContext.Current.OutgoingResponse.Headers.Add
刚刚尝试了这个,设置RequirementsMode=AspNetCompatibilityRequirementsMode.Required在启动我的服务时返回了一个错误,声明它需要托管在IIS中或具有非必需的设置。Works。。。最后,经过3天的阅读、搜索和尝试。如果可以的话,我会给你很多赏金,谢谢!
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class TestService : ValidationModel, ITestService
{
[OperationContract]
[FaultContract(typeof(ValidationFault))]
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
void GetOptions();
public void GetOptions()
{
WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
}