1

我创建了以下 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;
        }
    }
}

服务.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>

索引.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');
        }
    });
4

5 回答 5

1

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

于 2012-06-01T15:51:56.977 回答
1

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

于 2012-06-01T16:02:17.033 回答
0

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

看:

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

于 2012-05-31T17:25:38.627 回答
0

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

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

于 2012-06-01T15:40:44.803 回答
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();
            }
        }
    }
于 2016-06-24T19:34:37.673 回答