2
votes

I've created a .NET API, but when I try to use it I'm getting strange results.

If I go to the URL of an API call in Chrome I get the result I would expect, in XML format, but if I try it in IE it downloads a file and when I open it it just says {} or sometimes [{},{},{},{}] if I try a call that returns an array.

I've also tried using a webclient.

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

This also returns empty {}.

I've tried searching online, but I don't see any mentions of this problem anywhere. I'm sure I must be missing something somewhere, but I've tried looking over how I set up my API, and it all looks fine to me.

Edit:

Here's the response I get in 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>

It returns XML on Chrome because of Chrome's accept headers. It's supposed to return JSON on IE, but for some reason the JSON is empty.

This is in my api controller:

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

This is in my 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 }
    );
}

Edit:

This works great when I do an API call which doesn't require parameters.

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

I've been doing research, and I tried adding parameters like this:

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");

I've noticed that the number of empty {} in my array matches the number of items in the array if I put the full url with the querystring into chrome. It just empties them out for my webclient.

I also tried adding

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

before making the call, but there's still no change in the result.

And I tried to follow that tutorial, but it's written for a console application and they're using HttpClient. I can't do that because I can't do Asynchronous calls. This is to be used by a website. That's why I'm using WebClient. I also tried using StreamReader with HttpWebRequest and HttpWebResponse, but it had the same problem as I've been encountered with WebClient.

2
Show us the correct result. We can't do any analysis on no result.Robert Harvey
DownloadString probably won't send the right headers to the API. Have you tried passing an accept: application/xml header within a more configurable web call?Moo-Juice
Also {} and [{},{}] look like a JSON response, not XML.Moo-Juice
I've put the response in my edit.SurgeBinder
I've added all the code I know of that's relevant.SurgeBinder

2 Answers

1
votes

Without more information, it's a bit hard to diagnose your issue. However, I would say that it is likely your web API is interpreting the expected response type and providing an empty result as it does not support responses of that type, such as happens with ASP .NET Web API websites.

In that sense, the DownloadString is indicating it is expecting a text/html response. You should probably download the Microsoft ASP .NET Web API Client Libraries with NuGet. This library will give you HttpClient which has support for making the queries you want to make with responses such as application/json and application/xml.

You can view a tutorial on how to do the calls right here.

If you want it to work from your web browser, you need to ensure the Accept header field is correct, as you mentioned. Ensure it is being communicated with IE by using something like Fiddler.

0
votes

I figured out what the problem was. I needed to add [DataMember] attributes to the attributes of the items in the list. I didn't realize it was left out of the return type of that call.