关于c#:StatusCode:404,ReasonPhrase:’Not Found’,版本:1.1,

StatusCode: 404, ReasonPhrase: 'Not Found', Version: 1.1,

主持人:我使用Web API的自我教育

1
2
3
4
5
6
7
8
public class TestController : ApiController
{
    [HttpPost]
    public void Testp([FromBody]string title)
    {
        Console.WriteLine("Post");
    }
}

这是一个简单的控制器这是我的客户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
client.BaseAddress = new Uri("http://localhost:1010");
      const string englishTitle ="TesteDelete";
      var post = client.PostAsync("Test/Testp", new
      {
                    title = englishTitle
                }, new JsonMediaTypeFormatter());
                var result = post.Result;
                if (result.IsSuccessStatusCode)
                {

                }
                else
                {
                    string content = result.Content.ReadAsStringAsync().Result;

                }

为什么我的结果是:

1
2
3
4
5
6
7
{StatusCode: 404, ReasonPhrase: 'Not Found', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Date: Sun, 21 Apr 2013 12:00:03 GMT
  Server: Microsoft-HTTPAPI/2.0
  Content-Length: 165
  Content-Type: application/json; charset=utf-8
}}

我觉得我有一些错误modelbinder


我可以想象您正在使用Visual Studio Web服务器进行调试(按时钟)。此端口可以随时更改,因此我猜它不再是您的URL中指定的"1010":

"http://localhost:1010"

也许您应该在这里自动获取当前的URL。


我发现我的问题是,如果我没有用"/"结束基URI,并尝试将其预挂起到client.postasync(..它不起作用。但是如果我附加到基URI,它会这样做,

1
2
using (HttpClient client = new HttpClient(handler) { BaseAddress = new  Uri("https://test.test.com/somepath/") })
 var response = client.PostAsync("Broadcast/Order", content).Result;

工作,而:

1
2
 using (HttpClient client = new HttpClient(handler) { BaseAddress = new Uri("https://test.test.com/somepath") })
 var response = client.PostAsync("/Broadcast/Order", content).Result;

没有。不知道为什么,但很高兴我能很快找到答案!


  • 如果您使用的是默认路由,那么它是restful(通过http动词,而不是rpc,通过方法名),因此您不应该发布到http://localhost:1010/Test/Testp,而应该发布到http://localhost:1010/Test

  • 您的操作签名采用一个字符串,但您将改为发布一个匿名对象。您的帖子应该是这样的(注意我们只发送字符串):

    var post = client.PostAsync("Test", englishTitle, new JsonMediaTypeFormatter());


  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var url = URL;
                var data = new FormUrlEncodedContent(new[] {
                        new KeyValuePair<string, string>("client_id", FRAppConfigKeys.GetValue("ClientId")),
                        new KeyValuePair<string, string> ("client_secret", FRAppConfigKeys.GetValue("ClientSecret")),
                        new KeyValuePair<string, string>("grant_type", FRAppConfigKeys.GetValue("GrantType") ),
                        new KeyValuePair<string, string>("username", FRAppConfigKeys.GetValue("UserName")),
                        new KeyValuePair<string, string> ("password", FRAppConfigKeys.GetValue("Password"))
                    }
                );
                HttpResponseMessage response = client.PostAsync(url, data).Result;
                var result = response.Content.ReadAsStringAsync().Result;
                Dictionary<string, string> tokenDictionary =
                   JsonConvert.DeserializeObject<Dictionary<string, string>>(result);
                string token = tokenDictionary["access_token"];

    我也面临同样的问题。但现在解决了。您可以使用此代码。它真的会帮助你。