Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不允许自托管WCF REST服务JSON POST方法_Javascript_C#_Jquery_Json_Wcf - Fatal编程技术网

Javascript 不允许自托管WCF REST服务JSON POST方法

Javascript 不允许自托管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调用它的另一个

到目前为止,我已经在互联网上看到了数千个这样的“WCF”问题,但我开始认为这是不可能的。请有人告诉我我错了

背景:我正在使用一个自托管的WCF服务(因此Global.asax.cs在这里没有帮助)。端点也是通过编程方式定义的。契约是用WebInvoke(Method=“POST”)修饰的,我正在对服务进行JQuery调用

飞行前最初使用选项方法,但飞行后方法失败,不允许使用405方法。还可以让函数完美地工作

我已经在互联网上搜索和试验了大约一个月了,它不会改变。此服务已对通过TCP调用它的另一个客户端做出良好响应。。。请一些天才帮我一下。谢谢

PS:我觉得帖子的回复很奇怪,是允许:选项。。。那肯定不应该存在吗

CORS

    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;
    }