我有一个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>
感谢。
答案 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
来解决。