Web Api 2错误请求

时间:2016-01-22 11:50:13

标签: c# asp.net-web-api2 bad-request

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

我一直在寻找stackoverflow和其他地方一段时间,但我似乎无法找到任何明显错误的东西。

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

控制器如下所示:

 [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

但是响应总是糟糕的请求,我在控制器中有一个断点,它永远不会被调用。

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

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

Web API将根据您的方法名称决定您的路线。由于您在类级别添加了nextOrCreateButton.setTitle("FOOBAR", for: .normal) ,因此这将是您的控制器的路由。当web api查找某个操作时,它将匹配方法名称,因此在您的情况下,您的实际路由将为[RoutePrefix("api/ndtdocument")]

在尝试确定特定操作需要web {api}的http://localhost:9000/api/ndtdocument/post时,将检查您的方法名称和方法,从http method开始posthttp post将为{ {1}}等。

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

阅读评论后进行修改

/data

答案 1 :(得分:1)

奥凯,几乎疯了之后。我发现了这个问题。 我忘了引用webapi.webhost然后再引用system.web。

在此之后,Everything就像一个魅力。

答案 2 :(得分:0)

您必须使用路线标记并以http://localhost:9000/api/gethttp://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);

            }   
        }
    }

要获得更多信息,请查看此link