c# - 为什么我的 API 返回 {}

标签 c# api

我已经创建了一个 .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 的接受 header ,它在 Chrome 上返回 XML。它应该在 IE 上返回 JSON,但由于某种原因,JSON 为空。

这是在我的 api Controller 中:

[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 时遇到的问题相同。

最佳答案

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

从这个意义上讲,DownloadString 表示它正在等待 text/html 响应。您可能应该下载带有 NuGet 的 Microsoft ASP .NET Web API 客户端库。该库将为您提供 HttpClient,它支持使用 application/jsonapplication/xml 等响应进行查询。

您可以查看有关如何调用 right here 的教程.

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

关于c# - 为什么我的 API 返回 {},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18920330/

相关文章:

c# - 这两种任务方法的行为有何不同?

c# - 如何在 Visual Studio (2012) 中使用 RedditSharp?

javascript - Vimeo API : Play button and multiple videos

java api来运行Windows批处理程序?

c# - 如何解析我的 Bot Framework MessagesController 中的当前对话框堆栈?

javascript - 使用 javascript 调用元素内的部分 View

c# - 如何在 .razor.cs 文件后面注入(inject) blazor 代码?以 IJSRuntime 为例

c# - 如何使用 .NET 中的文件将 XML 转换为不带字符串的字符串?

php - 如何将 Postman 授权 OAuth2 请求转换为代码 PHP 或可压缩过程

java - 期望使用改造开始对象错误