通过javascript从另一个应用程序访问MVC操作

时间:2011-06-15 17:11:39

标签: javascript asp.net-mvc web-services

我有一个MVC 3网络应用程序,其中包含一个Action,我需要通过javascript从webform应用程序访问。

我的动作返回一个Json结果,我检查过的效果很好。但是,当使用来自其他应用程序的javascript访问它时,我可以看到它到达我的操作,完成所有工作,返回我的数据,但是jquery函数然后给我一个错误200而没有数据。

实施例: 我的MVC行动:

public ActionResult GetData(int categoryId)
{
   var listofSeries = new List<string>
               {
                   "foo1",
                   "foo2",
                   "foo3"
               };
   return Json(listofSeries, JsonRequestBehavior.AllowGet);
}

这会让我回复:["foo1","foo2","foo3"]

通常,我的javascript函数用于查询数据库并获取Highcharts图表的数据,但我对这种示例有同样的问题。

<script type="text/javascript">
    $(document).ready(function () {
        var foo = getData(9);
    });

    function getData(categoryId) {
            var results;

            $.ajax({
                type: 'POST',
                url: 'http://localhost:xxxx/Home/GetData',
                //contentType: "application/json; charset=utf-8;",
                async: false,
                data: { "categoryId": categoryId },
                dataType: "json",
                success: function (data) {
                    console.log("results: " + data);
                    results = data;
                }
            });

            return results;
        }
</script>

有了这个我得到:

http://localhost:63418/Home/GetData?categoryId=9 200 OK
results: null

如果我添加了contentType,我甚至看不到在firebug控制台中运行的函数,我看到的只是results: null。当我删除它时,我会收到上面的错误。

我被告知可能因为“跨站点脚本”而无法实现。而是让我的javascript函数调用webservice(或处理程序,但我还没弄清楚如何制作其中之一)然后调用我的操作,将我的数据返回给服务,然后将数据返回给javascript

但是现在我在尝试连接到我的网络服务时收到415 Unsupported Media Type错误消息。

我的IWebService.cs:

[ServiceContract]
    public interface IWebService
    {
        [OperationContract]
        [WebInvoke(ResponseFormat = WebMessageFormat.Json, Method = "POST")]
        void GetData(int mileId);
    }

我的WebService.svc:

public void GetData(int categoryId)
{
    string url = "http://localhost:63418/Home/GetWoWData?categoryId=" + categoryId;
    WebRequest wr = WebRequest.Create(url);
    WebResponse response = wr.GetResponse();
}

我还没有归还任何东西,它甚至不会进入这个功能。给我415错误消息。

如果我将contentType更改为“text / xml”,则会收到错误400。

我真的很想在没有使用web服务的情况下完成这项工作,并且在我看到行动正在运行的时候想出为什么我收到错误200 OK,但是如果那不可能,那么为什么webservice无法正常工作呢? / p>

感谢。

2 个答案:

答案 0 :(得分:0)

200让我觉得一切正常,但IE正在使用缓存结果,我在使用IE之前遇到过这个问题。尝试添加:

$.ajaxSetup({
    // Disable caching of AJAX responses */
    cache: false
});

这会使它附加一个随机参数,并阻止IE变得愚蠢。

答案 1 :(得分:0)

        string url = "http://localhost:63418/Home/GetWoWData?categoryId=" + categoryId;
        WebRequest wr = WebRequest.Create(url);
        wr.Credentials = CredentialCache.DefaultNetworkCredentials; // uses current windows user
        var response = (HttpWebResponse)wr.GetResponse();

我只是记得我曾经发过这篇文章并在不久前找到了解决方案。它通过添加凭据(在我的情况下是当前的Windows用户)并将响应作为HttpWebResponse来解决。