2015-07-11 5 views
1

В настоящее время я изучаю, как создавать C# -сервер с OWIN и Katana.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; 
} 

Edit: изменен маршрут к RoutePrefix до моего класса контроллера.

ответ

3

Сделать класс контроллера общедоступным.

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

Не будучи общедоступным, система Web API не может обнаружить контроллер и его действия.

1

Первое, что я хотел бы посмотреть, это то, что вы установили пакеты NuGet и убедитесь, что в вашем классе Startup все хорошо. Ваш класс запуска должен выглядеть следующим образом:

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

Убедитесь, что у вас установлены эти пакеты NuGet при размещении на IIS:

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

Try добавить public к контроллеру:

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

Поскольку вы используете Owin/катаной и атрибута маршрутизации вы можете избавиться от старой конфигурации веб-апи стиль:

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

и используя вместо этого:

config.MapHttpAttributeRoutes(); 

перед тем

app.UseWebApi(config); 

Делая это, вы должны префикс каждый RUOTE в вашем веб-апи, но, я думаю, это легче понять, и я слышал, что это собирается стать стандартом с vNext.

+0

Спасибо за советы по новой маршрутизации атрибутов. и да, я согласен, что проще и чище, если я должен установить Маршрут перед каждым из них! – Snowman

+0

Ooops, я не понимал, что у некоторых было правильное решение передо мной. – LeftyX