Не удается заполнить данные в контроллер веб-API - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть вызывающее приложение, которое имеет следующий код (я не могу изменить это приложение)

try
{
    string request = string.Format("UniqueId={0}&MobileNumber={1}&UssdText={2}&Type={3}&AccountId={4}", "1", "2", "3", "4",
        "5");


    using (HttpClient client = new HttpClient(new LoggingHandler(new HttpClientHandler())))
    {
        string url = "http://localhost/MocExternalEntityApis/MyUssd/Getdata3";
        client.DefaultRequestHeaders.ExpectContinue = false;

        StringContent content = new StringContent(request);
        content.Headers.Clear();
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var response = await client.PostAsync(url, content).ConfigureAwait(false);
        var readAsString = await response.Content.ReadAsStringAsync();

        client.Dispose();

    }
}
catch (Exception ex)
{
}

Мой контроллер веб-API, на который идет вызов, всегда имеет пустой объект

    [HttpPost]
    [ActionName("GetData3")]
    public JsonResult<MyResponse> GetData3(MyInput obj)
    {
        if (obj != null)
        {
            Logger.DebugFormat("UniqueId:{0},  MobileNumber:{1},  UssdText:{2},  Type:{3},  AccountId:{4}",
                obj.UniqueId, obj.MobileNumber, obj.UssdText, obj.Type, obj.AccountId);
            if (obj.Type == "3")
            {
                Task.Factory.StartNew(async () =>
                {
                    await ProcessCallbackHandlingofPinRespone(obj.UniqueId, obj.MobileNumber,
                        obj.UssdText);
                });
            }
            else
            {
                Task.Factory.StartNew(async () =>
                {
                    await ProcessCallbackHandlingOfNotification(obj.UniqueId, obj.MobileNumber,
                        obj.UssdText);
                });
            }
        }
        else
        {
            Logger.DebugFormat("Empty Object");
        }
        return Json(new MyResponse { Status = "OK" });
    }


[Serializable]
public class MyInput
{
    [JsonProperty(PropertyName = "UniqueId")]
    public string UniqueId { get; set; }

    [JsonProperty(PropertyName = "MobileNumber")]
    public string MobileNumber { get; set; }
    [JsonProperty(PropertyName = "UssdText")]
    public string UssdText { get; set; }
    [JsonProperty(PropertyName = "Type")]
    public string Type { get; set; }
    [JsonProperty(PropertyName = "AccountId")]
    public string AccountId { get; set; }
}

Какие изменения мне нужно сделать в My Web Api, чтобы использовать данные.

Журналы вызовов к моему API похожи на Запрос:

Method: POST, RequestUri: 'http://localhost/MocExternalEntityApis/MyUssd/Getdata3', Version: 1.1, Content: System.Net.Http.StringContent, Headers:
{
  Content-Type: application/json
}
UniqueId=1&MobileNumber=2&UssdText=3&Type=4&AccountId=5

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Я в конечном итоге смог получить отправленный контент через Request.Content

пример кода, как я упоминал в комментарии выше:

public class ValuesController : ApiController {
    // POST api/values
    [HttpPost]
    public async Task Post() {
        var requestContent = Request.Content;
        var jsonContent = await requestContent.ReadAsStringAsync();

    }
}
0 голосов
/ 19 сентября 2018

Попробуйте добавить атрибут [FromBody] в действие вашего контроллера, чтобы оно выглядело так:

[ActionName("GetData3")]
public JsonResult<MyResponse> GetData3([FromBody]MyInput obj)
{
  ...
}

Простые типы, такие как целые, связываются автоматически, но для более сложных типов, таких как MyInput, чем в ИнтернетеAPI пытается прочитать значение из тела сообщения, используя средство форматирования медиа.Предоставив атрибут [FromBody], он заставит читать тело запроса как простой тип и должен сериализовать его, как вы ожидаете

Более подробную информацию можно найти здесь: https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

...