跨域 AJAX 帖子 - WCF.



我创建了以下Web服务,并使用了我需要发布到Web服务的最新版本的jquery。

我想不通。 我读过JSONP不适用于POST。 我如何让它工作?

我需要使用 jQuery 到 WCF 做一个跨域帖子。

服务.cs:

namespace AjaxPost
{
    [DataContractAttribute]
    public class Message
    {
      [DataMemberAttribute]
      public string success;
      public Message(string success)
        this.success = success;
    }

    [ServiceContract(Namespace="JsonpAjaxService")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class User
    {
        [WebInvoke(ResponseFormat = WebMessageFormat.Json, Method="POST")]
        public Message CreateUser(string email, string username, string password, string phone, string image)
        {
           Message msg = new Message("true");
           return msg;
        }
    }
}

service.svc:

<%@ServiceHost 
  language="c#"
  Debug="true"
  Service="Microsoft.Samples.Jsonp.CustomerService"
  Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" 
%>

服务网络配置:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
  <httpProtocol>
      <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" />
      </customHeaders>
  </httpProtocol>
</system.webServer>
<system.serviceModel>        
    <behaviors>
        <serviceBehaviors>
            <behavior name="MetadataBehavior">
                <serviceDebug includeExceptionDetailInFaults="True" httpHelpPageEnabled="True" />
                <serviceMetadata httpGetEnabled="True"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
        <webScriptEndpoint>
            <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
        </webScriptEndpoint>
    </standardEndpoints>
</system.serviceModel>

索引.html

    wcfServiceUrl = "http://localhost:33695/Service.svc/CreateUser";
    $.ajax({
        crossDomain: true,
        cache: true,
        url: wcfServiceUrl,
        data: "{}",
        type: "POST",
        jsonpCallback: "Message",
        contentType: "application/json",
        dataType: "json",
        data: "{ "myusername": "mypassword" }",
        error: function (request, status, error) {
            //error loading data
            alert("error");
        },
        success: function (menu) {
            alert('success');
        }
    });

我已经在没有 CORS 的情况下完成了此操作。我所要做的就是允许服务器从任何地方接听电话。这是用 apache 完成的,但我看到您的网络服务器也有类似的东西。我遇到的问题是我需要指定允许的域,* 不起作用。此外,必须指定 http://site.example

你别无选择,只能使用服务器端应用程序来连接你的网络服务,如果它位于另一台服务器上,或者只使用JSONP(获取请求)。 没有其他解决方法。CORS 不适用于较旧的浏览器。

由于 http 标准,同源策略可能会受到影响。 您请求的网站是否位于其他应用程序或端口下?

看:

http://en.wikipedia.org/wiki/Same_origin_policy

我找到了使用 CORS(HTML 5 解决方案)的解决方案http://code.msdn.microsoft.com/windowsdesktop/Implementing-CORS-support-c1f9cd4b

如果有人知道不使用CORS(HTML 5)的工作解决方案,那就太棒了。 如果我错了,请纠正我,但是,CORS 需要支持 HTML 5 的浏览器,我更喜欢不依赖于 HTML 5 浏览器的解决方案。

我有一个简单的解决方案。要解决此问题,请执行以下操作:

创建一个 Global.asax 和以下代码以启用 Ajax 跨域 POST

 public void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST,OPTIONS");
            if ((HttpContext.Current.Request.HttpMethod == "OPTIONS"))
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                HttpContext.Current.Response.End();
            }
        }
    }

相关内容

  • 没有找到相关文章

最新更新