使用jQuery / asp.net Web Api时的奇怪行为

时间:2012-12-31 17:17:00

标签: asp.net asp.net-web-api

我有2个Web API项目:

  • Api1是JavaScript前端的测试环境,但有一个API 后端(默认的ValuesController),也用于测试。
  • Api2是“真正的”后端,实验性JavaScript UI可以从中提取数据。对于测试,我也在这里使用默认的ValuesController,因为,我想拥有相同的输出。

现状

  • Api1-UI可以从自己API的ValuesController查询数据

  • Api2返回正确数据(在Firefox和Fiddler中测试)

守则

JavaScript客户端:

    var _load = function (url) {
        $.ajax({
            url: url,
            method: 'GET',
            accepts: "application/json; charset=utf-8",
            success: function (data) {
                alert("Success: " + data);
            },
            error: function (data) {
                alert("Error :" + data);                  
            }
        });
    };

WebApi控制器方法:

    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

问题

实验性前端的JavaScript UI无法显示甚至接收来自API 2的数据,根据Fiddler的说法,这些数据发送正确。

我的第一个想法是,我使用了错误的方法,但我尝试了$.getJSON$.ajax.但我总是以错误结束。它只是说 statusText =“Error” 我不明白,为什么它可以显示来自自己的ApiController的数据,而不是来自“外部”......

感谢您提供任何帮助/建议

1 个答案:

答案 0 :(得分:2)

您似乎使用ajax从不同的域Y访问X中的数据。这似乎是一个典型的跨域访问问题。

您需要将 Access-Control-Allow-Origin 设置为值&#34; *&#34;在你的回复标题中。

 Response.Headers.Add("Access-Control-Allow-Origin", "*")

有各种方法可以解决这个问题

  • 在IIS中定义此标头
  • 使用如下所示的actionfilter属性

<强> FilterAttribute

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Response != null)
            actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

        base.OnActionExecuted(actionExecutedContext);
    }
}

在控制器操作上使用属性

[AllowCrossSiteJson]
public Result Get(int id)
{
   //return appropriate result
}