Контроллер C # Api не получает параметр json - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь создать базовый тестовый веб-интерфейс и использовать стандартный контроллер для его тестирования. Когда я запускаю его, положив http://localhost:55144/home/testapi

он запустит функцию catcher и полностью проигнорирует параметр. Затем перехватчик с радостью вернет значение, которое можно увидеть в коде вызова.

Я пробовал различные комбинации помещения [FromBody], изменения типа параметра в TestApiMethod и проверки, имеет ли какое-либо значение создание списка или массива.

Я заметил пару странных вещей: - Я не использую параметр в коде TestApiMethod, но Visual Studio не выдает предупреждение о неиспользуемой переменной. - Если я сделаю тип параметра testString строкой или даже целым числом, приведенный ниже код будет перенаправлен на сборщик. Если я сделаю какой-то вариант модели или Jobject, это не так. Доходит до бега

HttpResponseMessage response = await client.PostAsJsonAsync("api/activity", sendData);

затем просто возвращается на веб-страницу.

Вот код:

Модель

public class testStringModel
{
        public string testString { get; set; }
}

public class apiResponse
{
    public string response { get; set; }
}

Домашний контроллер, вызывающий Api:

   public void TestApi()
    {
        Task myTask = testApiCall();
    }


    private async Task<string> testApiCall()
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost:55144");

        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

        testStringModel data = new testStringModel { testString = "cheese" };
        string jsonData = JsonConvert.SerializeObject(data);
        var sendData = new StringContent(jsonData, Encoding.UTF8, "application/json");
        //var sendData = new Dictionary<string, string>
        //{
        //  {"testString", "cheese"}
        //};


        HttpResponseMessage response = await client.PostAsJsonAsync("api/activity", sendData);
        string responseBodyAsText = await response.Content.ReadAsStringAsync();

        dynamic stuff = JObject.Parse(responseBodyAsText);
        string finalResponse = stuff.response;


        return finalResponse;

        }
    }

API:

namespace ApplicationActivity
{
public class ActivityController : ApiController
{
    [System.Web.Http.HttpPost]
    public HttpResponseMessage Catcher()
    {
        apiResponse apiResponseObject = new apiResponse();
        apiResponseObject.response = "You have somehow wound up in the catcher";

        string json = JsonConvert.SerializeObject(apiResponseObject);

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
        response.Content = new StringContent(json, Encoding.Unicode, "application/json");
        response.Headers.CacheControl = new CacheControlHeaderValue()
        {
            MaxAge = TimeSpan.FromMinutes(20)
        };
        return response;

    }

    [System.Web.Http.HttpPost]
    public HttpResponseMessage TestApiMethod(string testString)
    {
        apiResponse apiResponseObject = new apiResponse();
        apiResponseObject.response = "OK from test";

        string json = JsonConvert.SerializeObject(apiResponseObject);

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
        response.Content = new StringContent(json, Encoding.Unicode, "application/json");
        response.Headers.CacheControl = new CacheControlHeaderValue()
        {
            MaxAge = TimeSpan.FromMinutes(20)
        };
        return response;

    }     
}

}

Скажите, пожалуйста, что я делаю не так с моим кодом, как это исправить и что происходит, когда код не попадает в ловушку?

Спасибо.

1 Ответ

0 голосов
/ 29 октября 2018

Оказывается, я использовал более старую версию visual studio, и в результате все было по-настоящему запутано тем, работало ли ядро ​​.net или нет. Обновление до последней версии и уверенность в том, что установлено новейшее ядро ​​.net, решило большинство моих проблем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...