C#ApiController HttpPost

时间:2015-07-28 11:36:47

标签: c#

我正在尝试让我的API在我的C#控制台应用程序中运行。我已经定义了一些控制器:

using System.Web.Http;
using Velox.Maple.Data;

namespace Velox.API.Controllers
{
    internal sealed class CharacterController : ApiController
    {
        [HttpGet]
        public int Count()
        {
            return CharacterDataProvider.Instance.Count;
        }

        [HttpPost]
        public void SetMap(int mapId)
        {

        }
    }
}

请注意,它需要mapId作为参数。

我正在使用RestSharp来测试我的API。这是执行请求的代码:

private void button1_Click(object sender, EventArgs e)
        {

            var client = new RestClient("http://localhost:8999");
            var request = new RestRequest(Method.POST);

            request.Resource = "character/SetMap";
            request.AddParameter("mapId", 100000000);

            var response = client.Execute(request);

            var data = response.Content;

            MessageBox.Show("Data: " + data);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var client = new RestClient("http://localhost:8999");
            var request = new RestRequest(Method.GET);

            request.Resource = "character/OnlineCount";

            var response = client.Execute(request);

            var data = response.Content;

            MessageBox.Show("Online: " + data);

        }

第二个按钮工作正常。它确实返回了值,它工作得很好。但是,第一个按钮不起作用。它说由于某种原因它找不到具体的方法。

我做错了什么?

4 个答案:

答案 0 :(得分:0)

我认为你需要利用我喜欢称之为请求模型

[HttpPost]
public void SetMap(MapRequest req)
{
    //now you have access to req.MapId
}

public class MapRequest
{
    public int MapId {get;set;}
}

这允许对请求正文进行反序列化并正确绑定。

答案 1 :(得分:0)

WebApi控制器操作对它们接收的参数非常敏感。我很确定它无法解析这个:

("mapId", 100000000);

到int mapId

确保正确使用AddParameter方法。

答案 2 :(得分:0)

您需要将控制器/操作与斜杠分开。

request.Resource = "character/Count";

另外,您指定了无效的操作名称:

 request.Resource = "character/OnlineCount";

没有方法'OnlineCount'

答案 3 :(得分:0)

首先,CharacterController不能内部,简单的类型参数(例如:int,long ...)从url查询中获取值,RestSharp将mapId发布在body中,这就是为什么mvc无法找到动作。你可以像这样标记mapId:([FromBody]int mapId),或者在url中传递mapID,如: character / SetMap?MapId = 1000