2

我创建了一个 .NET API,但是当我尝试使用它时,我得到了奇怪的结果。

如果我在 Chrome 中访问 API 调用的 URL,我会得到我期望的 XML 格式的结果,但如果我在 IE 中尝试它会下载一个文件,当我打开它时它只会显示 {} 或有时 [{} ,{},{},{}] 如果我尝试一个返回数组的调用。

我也尝试过使用网络客户端。

WebClient web = new WebClient();
var data = web.DownloadString("http://myAPI.example.com/api/MyAPI/APIMethod?parameter1=hiImAParameter");

这也返回空 {}。

我试过在网上搜索,但我在任何地方都没有看到任何关于这个问题的提及。我确定我一定是在某个地方遗漏了一些东西,但我已经尝试过查看我是如何设置我的 API 的,而且对我来说一切都很好。

编辑:

这是我在 Chrome 中得到的响应。

<ArrayOfRoute xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TimePointModel">
<Route>
    <RouteId>11235</RouteId>
    <RouteName>Fibonacci</RouteName>
    <Status i:nil="true"/>
    <Width>0</Width>
</Route>
</ArrayOfRoute>

由于 Chrome 的接受标头,它在 Chrome 上返回 XML。它应该在 IE 上返回 JSON,但由于某种原因 JSON 是空的。

这是在我的 api 控制器中:

[AcceptVerbs("GET")]
public IEnumerable<Route> APIMethod(double parameter)
{
    return new Manager(parameter).GetRoutes();
}

这是在我的 Global.asax.cs 中:

void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapHttpRoute(
        name: "APIMethod",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { action = "APIMethod", id = System.Web.Http.RouteParameter.Optional }
    );
}

编辑:

当我进行不需要参数的 API 调用时,这很有效。

WebClient web = new WebClient();
var data = web.DownloadString("http://myAPI.example.com/api/MyAPI/SimpleAPIMethod");

我一直在做研究,我尝试添加这样的参数:

NameValueCollection myQueryStringCollection = new NameValueCollection();
string myParameter = "hiImAParameter";
myQueryStringCollection.Add("parameter1", myParameter);
web.QueryString = myQueryStringCollection;
var data = web.DownloadString("http://myAPI.example.com/api/MyAPI/APIMethod");

我注意到如果我将带有查询字符串的完整 url 放入 chrome,我的数组中的空 {} 的数量与数组中的项目数匹配。它只是为我的网络客户端清空它们。

我也尝试添加

web.Headers[HttpRequestHeader.ContentType] = "application/json";

在拨打电话之前,但结果仍然没有变化。

我尝试按照该教程进行操作,但它是为控制台应用程序编写的,并且他们使用的是 HttpClient。我不能这样做,因为我不能进行异步调用。这将由网站使用。这就是我使用 WebClient 的原因。我还尝试将 StreamReader 与 HttpWebRequest 和 HttpWebResponse 一起使用,但它与 WebClient 遇到的问题相同。

4

2 回答 2

1

如果没有更多信息,诊断您的问题有点困难。但是,我会说您的 Web API 可能正在解释预期的响应类型并提供空结果,因为它不支持该类型的响应,例如 ASP .NET Web API 网站发生的情况。

从这个意义上说,这DownloadString表明它正在等待text/html响应。您可能应该使用 NuGet 下载 Microsoft ASP .NET Web API 客户端库。该库将为您HttpClient提供支持,以使用诸如application/json和之类的响应进行查询application/xml

您可以在此处查看有关如何进行呼叫的教程。

如果您希望它在您的网络浏览器中工作,您需要确保Accept标题字段是正确的,正如您所提到的。使用 Fiddler 之类的工具确保它与 IE 通信。

于 2013-09-20T18:47:10.640 回答
0

我弄清楚了问题所在。我需要将 [DataMember] 属性添加到列表中项目的属性中。我没有意识到它被排除在该调用的返回类型之外。

于 2014-11-05T21:06:00.940 回答