Ошибка 404 при публикации действия в Web API 2 с использованием HttpClient - PullRequest
0 голосов
/ 18 мая 2018

ОК, здесь много чего происходит, поэтому я постараюсь сохранить свой вопрос и примеры как можно проще.Имея это в виду, пожалуйста, спросите, нужна ли вам какая-либо дополнительная информация или разъяснения.

Код

У меня есть проект Web API 2, который имеет рядконтроллеры и действия.Конкретное действие, с которым у меня возникают проблемы, определяется в ContactController следующим образом:

[HttpPost]
public MyModel GetSomething(System.Nullable<System.Guid> uid)
{
    return GetMyModel(uid);
}

Если это имеет значение, моя маршрутизация настраивается следующим образом:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = RouteParameter.Optional }
);

Теперь у меня есть другой проект, который требуется для вызова вышеуказанного действия.Для вызова веб-API я использую HttpClient .Обратите внимание, что у меня есть много других вызовов действий, которые работают правильно, поэтому это не проблема с подключением.

Код, который я использую для вызова метода Web API, выглядит следующим образом:

using (HttpClient client = GetClient())
{
    var obj = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("uid", someGuid.ToString()) };
    var response = client.PostAsync(path, new FormUrlEncodedContent(obj)).Result;

    return response.Content.ReadAsAsync<T>().Result;
}

В данном случае path в основном:

localhost: 12345 / api / contact / getsomething

Проблема

PostAsync вызов Result (т. Е. response в приведенном выше коде) выдает это сообщение:

{StatusCode: 404, ReasonPhrase: 'Not Found', версия: 1.1, содержание: System.Net.Http.StreamContent, заголовки: {Pragma: нет-кэша X-исходников,: = UTF-8 B QzpcRGV2ZWxvcG1lbnRcUHJvamVjdHNcTGltYVxMaW1hIHYzXERFVlxMaW1hRGF0YVNlcnZpY2VcYXBpXHVzZXJhY2Nlc3NcZ2V0bW9kdWxlc2FjY2Vzcw == = Cache-Control:?? нет кэша Дата: Пт, 18 мая 201810:25:49 GMT Сервер: Microsoft-IIS / 10.0 X-AspNet-версия: 4.0.30319 X-Powered-By: ASP.NET Длина содержимого: 222 Тип содержимого: приложение / json;charset = utf-8 Истекает: -1}}

Если я ставлю точку останова внутри aciton, то она не срабатывает.Однако, что я нахожу странным, так это то, что, когда я вызываю его, Visual Studio (2018) сообщает мне, что конкретное действие имеет «неудавшийся запрос» на это конкретное действие.Так ясно, что он должен знать, какой метод я пытаюсь вызвать?

На данный момент у меня заканчиваются идеи о том, как отлаживать дальше.Что я тут не так делаю?

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

не уверен, но ошибка может быть из-за того, что вы передаете пару ключ-значение

var obj = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("uid", someGuid.ToString()) };
var response = client.PostAsync(path, new FormUrlEncodedContent(obj)).Result;

вместо только гильдии, то есть только строковое значение, ожидаемое функцией, поэтому оно будет

var response = client.PostAsync(path, new FormUrlEncodedContent(someGuid.ToString())).Result;

метод должен быть

[HttpPost]
public MyModel GetSomething(string uid)
{
    return GetMyModel(Guid.Parse( uid));
}
0 голосов
/ 18 мая 2018

Вы отправляете guid с FormUrlEncodedContent, но тип содержимого запросов - application / json.Я рекомендую вам отправить его как json, как этот

using (HttpClient client = GetClient())
{
    var obj = new { uid = someGuid.ToString()) };
    var json = JsonConvert.SerializeObject(obj);
    var content = new StringContent(json, Encoding.UTF8, "application/json");
    var result = client.PostAsync(path, content).Result;

    return response.Content.ReadAsAsync<T>().Result;
}

Затем в контроллере api используйте атрибут FromBody, чтобы объявить, что параметр читается из тела запроса

[HttpPost]
public MyModel GetSomething([FromBody]RequestModel model)
{
    return GetMyModel(model.uid);
}

public class RequestModel
{
    public System.Nullable<System.Guid> uid { get; set; }
}

Кроме того, если у вас есть только один метод Post в контроллере контактов, url localhost:12345/api/contact будет достаточно

0 голосов
/ 18 мая 2018

в этом случае вы можете использовать ту же конечную точку, что и для получения и публикации.

так что вам, вероятно, нужно:

[HttpGet]
public IActionResult Get(System.Nullable<System.Guid> uid)
{
    return GetMyModel(uid); //make sure you got it, oterhwise return a NotFound()
}

[HttpPost]
public IActionResult Post(InputModel model)
{
    _service.doMagicStuff();
    return Ok();
}

ура!

...