获取控制器中找不到http资源或操作的错误消息。在web api中,我有一个来自body和uri参数。
[HttpPost]
public IHttpActionResult processfields(
[FromUri]string field1,
[FromUri]string field2,
[FromBody] string field3,
[FromUri]string field4
){...}
在客户端我想通过执行 -
来调用web apiusing (var client = new HttpClient())
{
//set up client
client.BaseAddress = new Uri(Baseurl);
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var values = new Dictionary<string, string>();
values.Add("field1", field1);
values.Add("field2", field2);
values.Add("field3", field3);
values.Add("field4", filed4);
var jsonString = JsonConvert.SerializeObject(values);
try
{
HttpResponseMessage Res = client.PostAsync("api/home/processfields", new StringContent(jsonString, Encoding.UTF8, "application/json")).Result;
var result = Res.Content.ReadAsStringAsync();
}
}
在调试时,它执行上面的最后一行但没有任何反应,错误信息显示 -
{“Message”:“找不到与请求URI'http://xxx.xxx.xx.xx:1234/api/home/processfields'匹配的HTTP资源。”,“MessageDetail”:“在控制器'home'上找不到与请求匹配的操作。” }
我的webapi.config有
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
答案 0 :(得分:3)
field1
,field2
和field4
个参数,而不是请求正文中的参数。这就是请求Url应该是这样的原因:http://xxx.xxx.xx.xx:1234/api/home/processfields?field1=value1&field2=value2&field4=value4
field3
从身体反序列化。但是因为它是字符串参数,所以请求体不应该构建为JSON对象:
{
"field3": "value3"
}
但是作为JSON字符串:
"value3"
以下是经过调整的客户端代码:
using (var client = new HttpClient())
{
//set up client
client.BaseAddress = new Uri(Baseurl);
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var requestUri = new Uri($"api/home/processfields?field1={HttpUtility.UrlEncode(field1)}&field2={HttpUtility.UrlEncode(field2)}&field4={HttpUtility.UrlEncode(field4)}", UriKind.Relative);
var content = new StringContent($"\"{field3}\"", Encoding.UTF8, "application/json");
var response = await client.PostAsync(requestUri, content);
var result = await response.Content.ReadAsStringAsync();
}
答案 1 :(得分:3)
首先,看一下Web API方法签名,我认为这里根本不涉及任何JSON。所以我认为你可以跳过设置Accept
标题。 (如果[FromBody]
参数是一个复杂的对象而不是一个字符串,那么JSON序列化很可能会发挥作用。)
其次,永远不要将.Result
与HttpClient一起使用。它是一个仅支持异步的API,您应该使用async
/ await
,否则您只是在邀请死锁。
最后,正如其他人所指出的那样,field1,field2和field4进入查询字符串,而不是正文。如果你想要一种更有条理的方式来做到这一点,并且整体仪式较少,可以考虑使用Flurl(免责声明:我是作者),它使用了HttpClient:
using Flurl.Http;
var result = await BaseUrl
.AppendPathSegment("api/home/processfields")
.SetQueryParams(new { field1, field2, field4 })
.PostStringAsync(field3)
.ReceiveString();
答案 2 :(得分:0)
bodyClass obj = new bodyClass();
obj.empName= "your param value";
string DATA = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
var client = new HttpClient();
HttpContent content = new StringContent(DATA, UTF8Encoding.UTF8, "application/json");
HttpResponseMessage messge = client.PostAsync("your api url", content).Result;
if (messge.IsSuccessStatusCode)
{
string result = messge.Content.ReadAsStringAsync().Result;
}