2015-07-11 52 views
1

我目前在学习如何用OWIN和Katana创建C#服务器。PostAsJsonAsync找不到请求的URI

我想回应一个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 
    } 
} 

服务器端,在启动类,你可以看到路由设置:

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

编辑:改变路线到RoutePrefix我的控制器类之前。

回答

3

公开控制器类。

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

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

1

我要看的第一件事是你已经安装了NuGet软件包,并确保你的启动类中的一切都很好。您启动类应该是这样的:

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
1

尝试添加public到控制器:

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

由于您使用owin /武士刀和属性的路由可以摆脱旧风格的Web API的配置:

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

,并使用这个代替:

config.MapHttpAttributeRoutes(); 

app.UseWebApi(config); 

在此之前,你将不得不前缀每一个RUOTE在您的Web API,但是,我想,这是容易理解和我听说它要成为vNext标准。

+0

感谢您对新属性路由的建议。是的,我同意,如果我必须在每个人面前设置路线,它会更容易和更清洁! – Snowman

+0

Ooops,我没有意识到有些人在我面前有正确的解决方案。 – LeftyX

相关问题