我创建了以下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');
}
});
答案 0 :(得分:1)
我在没有CORS的情况下做到了这一点。 我所要做的就是让服务器从任何地方接听电话。这是用apache完成的,但我看到你的web服务器有类似的东西。 我遇到的问题是,我需要指定允许的域名,*不起作用。此外,必须使用http://site.example
指定答案 1 :(得分:1)
你没有太多选择,只能使用服务器端应用程序来连接你的webservice,如果它位于另一台服务器上。或者只使用JSONP(获取请求)。没有其他的工作。 CORS在旧浏览器上不起作用。
答案 2 :(得分:0)
答案 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();
}
}
}