我正在尝试让我的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);
}
第二个按钮工作正常。它确实返回了值,它工作得很好。但是,第一个按钮不起作用。它说由于某种原因它找不到具体的方法。
我做错了什么?
答案 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