2012-11-19 66 views
3

我有一个名为“UploadsController”的控制器。我有一个GET操作,像这样:WebForms中的ASP.NET Web API 404

public string GetUpload([FromUri]string action) 
{ 
    return "hey " + action; 
} 

如果我浏览到我的浏览器下面的API URL,我得到一个成功的响应。

http://localhost:52841/MySite/api/uploads?action=testaction 

然而,当我尝试调用从代码隐藏在我的WebForms应用程序的API,我得到一个404响应。

下面是我在我的Global.aspx文件(即使我认为首先应该做到这一点):

RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = System.Web.Http.RouteParameter.Optional } 
    ); 
    RouteTable.Routes.MapHttpRoute(
      name: "Default2Api", 
      routeTemplate: "api/{controller}/{action}", 
      defaults: new { controller = "Uploads", action = "GetUpload" }); 

这里是我如何调用API:

// Send a request asynchronously continue when complete 
    client.GetAsync("http://localhost:52841/MySite/api/uploads?action=testaction").ContinueWith(
     (requestTask) => 
     { 
      // Get HTTP response from completed task. 
      HttpResponseMessage response = requestTask.Result; 

      // Check that response was successful or throw exception 
      response.EnsureSuccessStatusCode(); 

      // Read response asynchronously as JsonValue 
      response.Content.ReadAsAsync<string>().ContinueWith(
         (readTask) => 
         { 
          var result = readTask.Result; 
          //Do something with the result     
         }); 
     }); 

我以为我以前做过这个(使用RC版本,现在使用RTM),但我似乎无法得到这个。

作为一个方面说明,由于某种原因,请求没有在fiddler中显示,当您尝试调试这些类型的东西时,这有点令人讨厌。

任何帮助表示赞赏。

+1

适用于我的机器。 :-) 第一步是让小提琴手在这里工作。看看[里克的帖子](http://www.west-wind.com/weblog/posts/2009/Jan/14/Monitoring-HTTP-Output-with-Fiddler-in-NET-HTTP-Clients-and -WCF-Proxies)配置Fiddler以使用HttpClient请求。 另外,正如你注意到的,你不需要你的global.asax文件中的第二条路线。第一个就够了。 –

+0

试过web.config方法,提琴手仍然没有捕获。 – Rivka

+0

啊,现在我相信你正在击中Fiddler本地主题的分类问题。根据Fiddler文档_“重要提示:无论其他设置如何,.NET都会绕过包含本地主机的URL的Fiddler代理,因此,而不是使用本地主机,请更改您的代码以引用计算机名称。”_ –

回答

2
  1. 试着将你的查询字符串参数命名为别的东西(现在它是“动作”)。我认为这是造成问题的原因之一。由于MVC是基于约定的,可能会导致问题。
  2. 同样在你的路由声明中,尝试添加查询字符串参数(让我把它称为custAction)。
  3. 并在默认路由之前声明自定义路由。

代码示例:

RouteTable.Routes.MapHttpRoute(
name: "Default2Api", 
     routeTemplate: "api/{controller}/{action}", 
     defaults: new { controller = "Uploads", action = "GetUpload", custAction = RouteParameter.Optional}); 
+0

没有工作。注意,“custAction”将作为查询字符串参数传递 - 它不应该是路由定义的一部分(?)另外,即使没有参数,我也会得到404。 – Rivka

+0

您是否尝试定义路由定义之前默认的一个? – gaurav

+0

我试着交换他们 - 是的。但再次 - 即使没有参数(和一个参数的行动),它给出了一个404。 – Rivka

1

是我经历过同样的问题,很可能是你的问题是的WebAPI犯规默认允许跨域调用,或者至少这是我知道这件事情。

你需要一个CORS支持添加到您的Web API代码,按照链接这家伙已经展示了如何CORS添加到您的WebAPI

http://code.msdn.microsoft.com/CORS-support-in-ASPNET-Web-01e9980a

好运。

+0

它不是我的情况下跨域(如果我理解正确) – Rivka

+0

您是否从同一个解决方案调用您的webapi?就像你是在webapi的相同解决方案中编写消费者代码一样?或者webapi部署在其他地方,如果是的话,您正在使用单独的应用程序来使用webapi,然后尝试使用CORS问题。我有同样的问题..你的浏览器显示一个错误,如原产地访问等? – Aakif

+0

不 - 在我的示例中,我使用同一个解决方案中的Web API和客户端代码。 – Rivka