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