我正在开发一个C#MVC Web应用程序,它将跨域请求发送到Web API REST服务。但是我一直在犯错误。我的jquery代码如下:
$.ajax({
url: RESTurl,
type: 'GET',
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: 'myCallback'
});
window.myCallback = function (data) {
console.log(data);
};
处理我的请求的webAPI代码是这样的:
[HttpPost, HttpGet]
public String checkStatus(string passedId)
{
//some other code
return "Status Unavailable";
}
我的webApiConfig文件如下:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{passedId}",
defaults: new { passedId = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes
.Add(new MediaTypeHeaderValue("text/html"));
我的问题是,当我在浏览器地址栏中输入请求时,我得到了正确的回复 - Status Unavailable
。 (我也使用邮递员得到正确答案,但我认为这是因为CORS不适用于邮递员)
我尝试添加crossDomain: 'true'
并在项目中添加jquery跨域插件,但它没有帮助。
我也尝试过没有回调功能,但我没有得到结果。
还尝试将Microsoft.AspNet.WebApi.Cors
添加到webApi项目,然后添加
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
到webApiConfig.cs(如建议的here)但它也没有任何区别。如果CORS出现问题,直接从浏览器输入会有什么响应,我感到很惊讶。 我目前的回答是这样的:
http://xxxxx.com:xxxx/xerviceapi/api/xxx/checkstatus/3?callback=myCallback&_=1500087168776
正如您可能看到的,我的jquery版本是1.10(很小),但我现在无法升级,因为其他模块依赖它。这是一个原因吗?
即使我从浏览器收到回复,我还需要向webAPI添加响应主体吗?如果是这样的话?请帮忙。
答案 0 :(得分:0)
看起来您的问题可能与CORS有关,请尝试将此标题添加到您的webAPI:
Access-Control-Allow-Origin: *
答案 1 :(得分:0)
经过大量的反复试验,感谢@Khanh TO和@Hugo Sama的有用建议,我发现问题在于webAPI未正确配置以添加CORS标头。
还应该注意的是,JSONP是一个完全不同的概念,它是绕过浏览器中CORS限制的一种方式。
首先,关于使用JSONP,它只支持GETrequests,旧版浏览器和旧版本的jquery也可能不支持。更好的选择是使用常规的ajax请求,它支持所有的http请求方法。 配置webAPI以响应CORS请求非常简单,但看起来很棘手。
我会按照我的步骤进行操作。 This link非常有帮助。
首先,您需要安装软件包Install-Package
Microsoft.AspNet.WebApi.Cors
来自包管理器控制台或来自nuget数据包管理器。之后,在App_Start/WebApiConfig.cs
中,我添加了Application_BeginStart
方法,如下所示:
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
Response.End();
}
}
接下来,在控制器类开始之前添加EnableCors属性,如下所示:
using System.Web.Http.Cors;
namespace xxxAPI.Controllers
{
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class xxxxController : ApiController
{ //.. blah blah blah
您也可以在各个动作控制器上使用此属性。可以根据您的要求更改参数。我的代码从任何URL,任何方法启用CORS请求。请查看上面提到的链接以获取更多信息。
最后,您需要在<system.webServer>
下的webconfig文件中添加以下行。
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="*" />
<add name="Access-Control-Allow-Headers" value="*"/>
</customHeaders>
</httpProtocol>
有些消息来源还要求您添加:
config.enableCors();
WebApiConfig.cs
中的,但这会导致webApi发回多个CORS标头,这会导致浏览器出现问题。我相信你应该设置webConfig文件或WebApiConfig.cs文件,只需一个。 就是这样,没有必要为我改变webApiConfig。
为了完整性,这里是我的服务中的示例动作控制器方法,它返回httpResponseMessage
。
[HttpPost, HttpGet]
public HttpResponseMessage stopxxxxx(string passedId)
{
string returnedValue = "Error Stopping xxxxx";
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(returnedValue, System.Text.Encoding.UTF8, "text/plain")
};
}
这是我在jquery中发出的请求(正如你所看到的,它是一个普通的简单ajax查询):
$.ajax({
type: 'GET',
url: RESTurl,
}).done(function (data) {
//alert(data);
}).error(function (jqXHR, textStatus, errorThrown) {
//handle error
});