Web Api 2 bad request

不打扰是莪最后的温柔 提交于 2019-12-08 04:32:01

问题


Im a beginner with Web api and Im trying to setup a simple owin selfhosted service that Im trying out.

I've been searching stackoverflow and other places for a while now, but I cant seem to find anything obviously wrong.

The problem I have is that I get a bad request response everytime I try to call my service.

The controller looks like this:

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

        }


    }





}

And the client looks like this:

     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;



    }

I can see when I debug it that the request uri is infact http://localhost:9000/api/ndtdocument

But the response is allways bad request and I have a breakpoint in the controller and it is never invoked.

Everytime I try to do something with web apis I Always run into some weird (but simple problem).

Any thoughts?

Thanks!


回答1:


Web API will decide your route based on your method names. Since you have added [RoutePrefix("api/ndtdocument")] on class level this will be the route to your controller. When web api looks for an action it will match on method names, so in your case your actual route would be http://localhost:9000/api/ndtdocument/post.

When trying to decide what http method that a specific action requires web api will check your method names and methods starting with post will be http post, get will be http get etc.

So lets say we would instead call our method PostData, for starters we could remove the [HttpPost] attribute. Our route would now be http://localhost:9000/api/ndtdocument/postdata. Let's now say that we want our path to be just /data. We would then first rename our method to Data, but now web api does not know what http method we want to invoke this method with, thats why we add the [HttpPost] attribute.

Edit after reading your comment

[Route("{id:int}")]
public IHttpActionResult Get(int id)

[Route("")]
public IHttpActionResult Post([FromBody] NDTDocument ndtDocument)



回答2:


Okey, after nearly going seriously insane. I found the problem. I forgot to reference webapi.webhost and then system.web.

After this Everything worked like a charm.




回答3:


You must use route tags and call this way http://localhost:9000/api/get or http://localhost:9000/api/post

 [RoutePrefix("api/ndtdocument")]
    public class NDTDocumentsController : ApiController, INDTDocumentsController
    {
        [HttpGet]
        [Route("get")]
        public IHttpActionResult Get()
        {
            var document = Program.NDTServerSession.GetNextNDTDocument(DateTime.Today);
            if (document == null)
                return null;

            return Ok(document);


        }

        [HttpPost]
        [Route("post")]
        public IHttpActionResult Post([FromBody] NDTDocument ndtDocument)
        {
            try
            {
                Program.NDTServerSession.AddNDTDocument(ndtDocument);
                return Ok();
            }
            catch(Exception ex)
            {
                return BadRequest(ex.Message);

            }   
        }
    }

for more infromation pls check this link



来源:https://stackoverflow.com/questions/34946072/web-api-2-bad-request

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!