跨域AJAX Post - WCF

时间:2012-05-31 16:59:58

标签: jquery ajax json cross-domain jsonp

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

我无法弄清楚这一点。我已经读过JSONP不能用于POST。我如何让它工作?

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

service.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" 
%>

服务Web.Config:

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

的index.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');
        }
    });

5 个答案:

答案 0 :(得分:1)

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

指定

答案 1 :(得分:1)

你没有太多选择,只能使用服务器端应用程序来连接你的webservice,如果它位于另一台服务器上。或者只使用JSONP(获取请求)。没有其他的工作。 CORS在旧浏览器上不起作用。

答案 2 :(得分:0)

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

请参阅:

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

创建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();
            }
        }
    }