我是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做某事时,我总会遇到一些奇怪的问题(但很简单)。
有什么想法吗?
谢谢!
答案 0 :(得分:2)
Web API将根据您的方法名称决定您的路线。由于您在类级别添加了nextOrCreateButton.setTitle("FOOBAR", for: .normal)
,因此这将是您的控制器的路由。当web api查找某个操作时,它将匹配方法名称,因此在您的情况下,您的实际路由将为[RoutePrefix("api/ndtdocument")]
。
在尝试确定特定操作需要web {api}的http://localhost:9000/api/ndtdocument/post
时,将检查您的方法名称和方法,从http method
开始post
,http post
将为{ {1}}等。
所以我们假设我们会调用我们的方法get
,对于初学者我们可以删除http get
属性。我们的路线现在是PostData
。我们现在说我们希望我们的路径只是[HttpPost]
。然后我们首先将我们的方法重命名为Data,但现在web api不知道我们想要调用此方法的http方法,这就是我们添加http://localhost:9000/api/ndtdocument/postdata
属性的原因。
阅读评论后进行修改
/data
答案 1 :(得分:1)
在此之后,Everything就像一个魅力。
答案 2 :(得分:0)
您必须使用路线标记并以http://localhost:9000/api/get或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);
}
}
}
要获得更多信息,请查看此link