Skip to main content
 首页 » 编程设计

c#之Web Api 2 错误请求

2024年05月10日44落叶

我是 Web api 的初学者,我正在尝试设置一个简单的 owin 自托管服务,我正在试用。

我已经在 stackoverflow 和其他地方搜索了一段时间,但我似乎找不到任何明显的错误。

我遇到的问题是每次我尝试调用我的服务时都会收到错误的请求响应。

Controller 看起来像这样:

 [RoutePrefix("api/ndtdocument")] 
public class NDTDocumentsController : ApiController, INDTDocumentsController 
{ 
    [HttpGet] 
    public IHttpActionResult Get() 
    { 
        var document = Program.NDTServerSession.GetNextNDTDocument(DateTime.Today); 
        if (document == null) 
            return null; 
 
        return Ok(document); 
 
 
    } 
 
    [Route("")] 
 
    public IHttpActionResult Post([FromBody] NDTDocument ndtDocument) 
    { 
        try 
        { 
            Program.NDTServerSession.AddNDTDocument(ndtDocument); 
            return Ok(); 
        } 
        catch(Exception ex) 
        { 
            return BadRequest(ex.Message); 
 
        } 
 
 
    } 
 
 
 
 
 
} 

客户端看起来像这样:

     static void Main(string[] args) 
    { 
 
 
         AddNDTDocument(@"C:\Testing.txt"); 
 
 
    } 
 
 
 
    private static void AddNDTDocument(string centralserverPath) 
    { 
 
        var client = GetServerClient(); 
        NDTDocument document = new NDTDocument(); 
        var response = client.PostAsJsonAsync("ndtdocument", document).Result; 
 
 
    } 
 
    static HttpClient GetServerClient() 
    { 
        var client = new HttpClient(); 
        client.BaseAddress = new Uri("http://localhost:9000/api/"); 
        client.DefaultRequestHeaders.Accept.Clear(); 
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
        return client; 
 
 
 
    } 

当我调试它时,我可以看到请求 uri 实际上是 http://localhost:9000/api/ndtdocument

但是响应总是错误的请求,我在 Controller 中有一个断点,它永远不会被调用。

每次我尝试使用 web api 做一些事情时,我总是会遇到一些奇怪的(但很简单的)问题。

有什么想法吗?

谢谢!

请您参考如下方法:

Web API 将根据您的方法名称决定您的路由。由于您在类级别添加了 [RoutePrefix("api/ndtdocument")] 这将是您的 Controller 的路由。当 web api 查找操作时,它将匹配方法名称,因此在您的情况下,您的实际路由将是 http://localhost:9000/api/ndtdocument/post。

当试图决定特定操作需要什么 http 方法 时,web api 将检查您的方法名称,以 post 开头的方法将是 http post, get 将是 http get 等

假设我们改为调用我们的方法 PostData,对于初学者,我们可以删除 [HttpPost] 属性。我们的路线现在是 http://localhost:9000/api/ndtdocument/postdata。现在假设我们希望我们的路径只是/data。然后我们首先将我们的方法重命名为 Data,但是现在 web api 不知道我们要调用这个方法的 http 方法,这就是我们添加 [HttpPost] 属性的原因。

阅读您的评论后进行编辑

[Route("{id:int}")] 
public IHttpActionResult Get(int id) 
 
[Route("")] 
public IHttpActionResult Post([FromBody] NDTDocument ndtDocument)