2015-05-04 63 views
1

我很抱歉,如果这个问题看起来微不足道,但对WebAPI来说是新的,我不能 获得客户端访问Put方法。
这里是我的WebAPI方法通过Put请求在WebAPI中访问方法

public class TestController : ApiController 
{ 
    [HttpPut] 
    public HttpResponseMessage Put(string id) 
    {   
     var response = new HttpResponseMessage(); 
     response.Headers.Add("Message","Success"); 
     return response; 
    }  
} 

路由配置

//configure the webapi so that it can self host 
var config = new HttpConfiguration(); 
config.MapHttpAttributeRoutes(); 
config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "{Controller}/{action}/{id}", 
     defaults: new {id = RouteParameter.Optional } 
); 

客户

var baseAddress="http://localhost:8000/"; 
var client= new HttpClient {BaseAddress = new Uri(baseAddress)}; 
client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
HttpResponseMessage response = client.PutAsJsonAsync(baseAddress+"Test", "TestParam").Result; 
Console.WriteLine(response.Content); 

当我运行上面的代码。 我得到404错误出于某种原因,意味着客户端无法联系webapi方法。

我有三个问题。
1.如何确保客户端可以正确调用Web API方法。
2.是否可以直接从url调用该方法? 我试过http://localhost:8000/test/Dummy但没有运气。
3.如果可以调用该方法,我如何确保该消息显示在页面上显示“成功”。

回答

1

如果您未在配置的路由中指定操作,则您的代码可以正常工作。在这种情况下,该操作由HTTP方法(PUT,POST,DELETE,GET ...)选择。路线shpukd是这样的:

routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

正如您所指定的路线{action}一部分,则必须在URL中指定的动作。在这种情况下,url应该是这样的:

http://localhost:8000/Test/Put 

请参阅Routing in ASP.NET Web API

如果您想测试您的Web API方法,可用的最佳工具之一是Postman,这是一个Chrome扩展。这解决了您的问题1 & 2.

对于Q3:当您拨打asycn电话时,您必须await作为响应消息,阅读并显示相应消息。如果您不知道异步/等待模型,则可以使用read this documentation

+0

嗨JotaBe感谢您的评论。是的,我确实使用了基于您建议的路由的代码。即使使用http:// localhost:8000/Test/Put也不行。这应该是http:// localhost:8000/Test/IdName我通过文档阅读了这篇文档,但文档没有足够的解释放置请求。 – Sike12

+0

如果您在我的答案中使用路线,则可以使用以Put开头的任何操作名称。该文档解释了这一点:*此惯例仅适用于GET,POST,PUT和DELETE方法*。如果它不适合你,那肯定是另外一个问题。请安装并使用邮递员创建执行PUT请求,并让我知道答案是什么。像GET或POST等其他方法可以为你工作吗? – JotaBe

+0

是的JotaBe。它的工作现在。非常感谢您的帮助 :) – Sike12