WCF отвечает HTTP 400 на сериализованную строку JSON из приложения Razor Pages

// Without Initializer List
class MyClass {
    Type variable;
public:
    MyClass(Type a) {  // Assume that Type is an already
                     // declared class and it has appropriate 
                     // constructors and operators
        variable = a;
    }
};

Здесь компилятор выполнил следующие шаги для создания объекта типа MyClass 1. Конструктор типа сначала называется «a». 2. Оператор присваивания «Тип» вызывается внутри тела конструктора MyClass () для назначения

variable = a;
  1. . И тогда деструктор «Тип» вызывается для «a», поскольку он идет вне сферы действия. Теперь рассмотрим тот же код с конструктором MyClass () с Initializer List
    // With Initializer List
     class MyClass {
    Type variable;
    public:
    MyClass(Type a):variable(a) {   // Assume that Type is an already
                     // declared class and it has appropriate
                     // constructors and operators
    }
    };
    
    . С помощью списка инициализаторов следуют шаги, за которыми следует компилятор: Копировать конструктор класса «Тип» вызывается для инициализации: variable (a). Аргументы в списке инициализаторов используются для непосредственного копирования «переменной». Деструктор «Тип» вызывается для «а», поскольку он выходит за рамки.
0
задан everette 29 March 2019 в 15:31
поделиться

1 ответ

Есть 2 возможных BodyStyle для запроса и ответа, завернутый или голый . Когда вы указываете упакованный стиль тела , служба WCF ожидает, что будет передан действительный json, который в вашем случае будет

//note that property name is case sensitive and must match service parameter name
{
    "jsonString": "some value"
}

И когда вы укажете bare отформатировать, что служба ожидает только обычное строковое значение (в случае типа примитива, как ваш) в качестве запроса, подобного этому

"some value"

Когда вы сериализуете свой объект следующим образом

dynamic foo = new ExpandoObject();
foo.position = 1;

string result = JsonConvert.SerializeObject(foo);

the [118 ] содержит следующий json

{
    "position":1
}

, который соответствует формату в оболочке , и служба возвращает 400: Bad Request. Все, что вам нужно сделать, это превратить этот json в действительное значение json string, например,

"{\"position\":1}"

. Это можно сделать повторным вызовом JsonConvert.SerializeObject

dynamic foo = new ExpandoObject();
foo.position = 1;

string wrapped = JsonConvert.SerializeObject(foo);
string bare = JsonConvert.SerializeObject(wrapped);
var content = new StringContent(bare, System.Text.Encoding.UTF8, "application/json");
.
0
ответ дан Alexander 29 March 2019 в 15:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: