Отправить динамический c объект через HTTP-запрос POST в c# - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь отправить динамический c объект через и запрос HTTP POst, но когда я получаю этот объект, он пуст.

Я не могу использовать JObject, потому что у меня есть «виртуальный» API, и он не принимает JObjects.

Я пытался отправить объект типа и Dynami c. Оба они не работают. Может ли какое-нибудь тело помочь мне?

Вот мой запрос на сообщение:

public static void Post(string uri, object parameter, string serviceName)
        {
            StringBuilder url = new StringBuilder();
            url.Append(uri);
            var client = GetClient(url.ToString(), 300, "application/json");
            var urlParameters = GetUrlParameters(new List<KeyValuePair<string, object>>() { });


            var response = client.PostAsync(
                urlParameters,
                new StringContent(
                    JsonConvert.SerializeObject(parameter).ToString(),
                    Encoding.UTF8,
                    "application/json")
                ).Result;

            if (response.StatusCode != System.Net.HttpStatusCode.OK)
                throw new Exception($"{serviceName}: {response.StatusCode}");
        }

Вот где я получаю этот пост:

Перехват для метода:

 [OperationContract]
        [WebInvoke(Method = "POST",
           ResponseFormat = WebMessageFormat.Json,
           RequestFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.Bare,
           UriTemplate = "Teste")]
        void Teste(object requestData);

Метод, реализованный в классе (это фактически, где я получаю данные):

public void Teste(object requestData)
        {
            var teste = requestData;
            var t1 = JsonConvert.SerializeObject(requestData); // this returns {}; (empty)
        }

1 Ответ

0 голосов
/ 18 февраля 2020

Можете ли вы немного подправить свой POST, чтобы устранить проблему? Что-то вроде следующего? (не скомпилировано)

var rawJson = await client.PostAsync(
                urlParameters,
                new StringContent(
                    JsonConvert.SerializeObject(parameter).ToString(),
                    Encoding.UTF8,
                    "application/json")
                ).Content.ReadAsStringAsync();

var mappedObj = JsonConvert.DeserializeObject<T>(rawJson,
    new JsonSerializerSettings
    {
        Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
        {
            // convert this to your logger
            LogHelper.Instance.Warning(2000, string.Format("Failed object mapping: {0}\n{1}",
                args.ErrorContext.Error, rawJson));
            args.ErrorContext.Handled = true;
        },
        // set culture to mitigate mapping issues related to dates/numbers
        // https://stackoverflow.com/a/34529198
        Culture = CultureInfo.InvariantCulture
    });
...