PostAsJsonAsync无法找到请求的URI

时间:2015-07-11 18:24:18

标签: c# post asynchronous owin katana

我目前正在学习如何使用OWIN和Katana创建C#服务器。

我正在尝试回复POST,但不幸的是它找不到该功能。

这就是我所拥有的:

这是一个用户端类,它通过POST发送用户数据(用户名和密码)( PostAsJsonAsync()的)。

public class UserRegisterClient
{
    string _accessToken;
    Uri _baseRequestUri; // http://localhost:8080
    public UserRegisterClient(Uri baseUri, string accessToken)
    {
        _accessToken = accessToken;
        _baseRequestUri = new Uri(baseUri, "api/register/");
    }

    // Handy helper method to set the access token for each request:
    void SetClientAuthentication(HttpClient client)
    {
        client.DefaultRequestHeaders.Authorization
            = new AuthenticationHeaderValue("Bearer", _accessToken);
    }

    public async Task<HttpStatusCode> AddUserAsync(string username, string password)
    {
        HttpResponseMessage response;
        using (var client = new HttpClient())
        {
            SetClientAuthentication(client);
            response = await client.PostAsJsonAsync(
                _baseRequestUri.ToString(), new KeyValuePair<string, string>(username, password));
        }
        return response.StatusCode;
    }
}

附加信息:
在AddUserAsync函数 client.PostAsJsonAsync()中返回以下内容:

response =  
{
    StatusCode: 404,
    ReasonPhrase: 'Not Found',
    Version: 1.1,
    Content: System.Net.Http.StreamContent,
    Headers: 
    {   
        Date: Sat, 11 Jul 2015
        18:16:53 GMT   Server: Microsoft-HTTPAPI/2.0   Content-Length: 190  
        Content-Type: application/json; charset=utf-8
    }
}   System.Net.Http.HttpResponseMessage


服务器端,我有一个控制器,如下所示:

[RoutePrefix("api/register/")]
class RegisterController : ApiController
{
    public async Task<IHttpActionResult> Post(KeyValuePair<string, string> userData) 
    {
       // I never get inside here
    }
}

服务器端,在Startup类中,您可以看到路由设置:

private HttpConfiguration ConfigureWebApi()
{
      var config = new HttpConfiguration();
      config.Routes.MapHttpRoute(
           "DefaultApi",
           "api/{controller}/{id}",
           new { id = RouteParameter.Optional });
      return config;
}

编辑:在我的控制器类之前将路由更改为RoutePrefix。

3 个答案:

答案 0 :(得分:3)

使Controller类公开。

[Route("api/register/")]
public class RegisterController : ApiController

不公开意味着Web API系统无法发现控制器及其操作。

答案 1 :(得分:1)

我要看的第一件事是你安装的NuGet软件包,并确保你的Startup类中的一切都很好。您的Startup类应如下所示:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = ConfigureWebApi();
        app.UseWebApi(config);
    }
}

如果您在IIS上托管,请确保安装了这些NuGet包:

  • Newtonsoft.Json
  • Microsoft.AspNet.WebApi.Client
  • Microsoft.AspNet.WebApi.Core
  • Microsoft.AspNet.WebApi.Owin
  • Microsoft.Owin.Host.System.Web
  • Microsoft.Owin
  • Owin

答案 2 :(得分:1)

尝试将public添加到您的控制器:

[Route("api/register/")]
public class RegisterController : ApiController
{
    public async Task<IHttpActionResult> Post(KeyValuePair<string, string> userData) 
    {
       // I never get inside here
    }
}

由于你正在使用owin / katana和属性路由,你可以摆脱旧式web api配置:

var config = new HttpConfiguration();
      config.Routes.MapHttpRoute(
           "DefaultApi",
           "api/{controller}/{id}",
           new { id = RouteParameter.Optional });
      return config;

并改为使用它:

config.MapHttpAttributeRoutes();

之前

app.UseWebApi(config);

这样做你必须在你的web api中为每一个符号添加前缀,但是,我想,它更容易理解,我已经听说它将成为vNext的标准。