无法使用jquery

时间:2017-07-15 03:31:40

标签: javascript c# jquery asp.net-mvc-4 asp.net-web-api

我正在开发一个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

这是一个截图: enter image description here

正如您可能看到的,我的jquery版本是1.10(很小),但我现在无法升级,因为其他模块依赖它。这是一个原因吗?

即使我从浏览器收到回复,我还需要向webAPI添加响应主体吗?如果是这样的话?请帮忙。

2 个答案:

答案 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
    });