为什么我的API会返回{}

时间:2013-09-20 15:20:31

标签: c# api

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

如果我转到Chrome浏览器中的API调用网址,我会以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中,则数组中的空{}数与数组中的项数相匹配。它只是为我的webclient清空它们。

我也尝试添加

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

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

我尝试遵循该教程,但它是为控制台应用程序编写的,他们正在使用HttpClient。我做不到,因为我不能做异步调用。这将由网站使用。这就是我使用WebClient的原因。我也尝试过使用带有HttpWebRequest和HttpWebResponse的StreamReader,但它遇到了与WebClient遇到的问题相同的问题。

2 个答案:

答案 0 :(得分:1)

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

从这个意义上讲,DownloadString表示期待text/html响应。您应该使用NuGet下载Microsoft ASP .NET Web API客户端库。该库将为您HttpClient提供支持,可以使用application/jsonapplication/xml等回复来制作您要进行的查询。

您可以查看有关如何拨打电话right here的教程。

如果您希望它在您的网络浏览器中运行,您需要确保Accept标题字段正确,如您所述。确保使用像Fiddler这样的东西与IE进行通信。

答案 1 :(得分:0)

我弄清楚问题是什么。我需要将[DataMember]属性添加到列表中项目的属性中。我没有意识到它被排除在那个电话的返回类型之外。