我已经创建了一个.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遇到的问题相同的问题。
答案 0 :(得分:1)
如果没有更多信息,诊断问题会有点困难。但是,我会说你的Web API可能正在解释预期的响应类型并提供空结果,因为它不支持该类型的响应,例如ASP .NET Web API网站发生的响应。
从这个意义上讲,DownloadString
表示期待text/html
响应。您应该使用NuGet下载Microsoft ASP .NET Web API客户端库。该库将为您HttpClient
提供支持,可以使用application/json
和application/xml
等回复来制作您要进行的查询。
您可以查看有关如何拨打电话right here的教程。
如果您希望它在您的网络浏览器中运行,您需要确保Accept
标题字段正确,如您所述。确保使用像Fiddler这样的东西与IE进行通信。
答案 1 :(得分:0)
我弄清楚问题是什么。我需要将[DataMember]属性添加到列表中项目的属性中。我没有意识到它被排除在那个电话的返回类型之外。