WCF BodyStyle WrappedRequest не работает для входящего параметра JSON? - PullRequest
10 голосов
/ 01 сентября 2011

Я работал над получением службы RESTful WCF, которая принимала бы JSON в качестве параметра и возвращала некоторый JSON.

Это мой сервис:

    [OperationContract]
    [WebInvoke(
        Method="POST",
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "Authenticate")]
    public AuthResponse Authenticate(AuthRequest data)
    {
        AuthResponse res = new AuthResponse();
        if (data != null)
        {
            Debug.WriteLine(data.TokenId);
            res.TokenId = new Guid(data.TokenId);
        }
        return res;
    }

Выше будет установлено, что data будет нулевым, когда я передам {AuthRequest: {TokenId = "some guid"}}.

Если я установлю BodyStyle метода равным Bareтогда данные установлены правильно, но я должен удалить {AuthRequest} из JSON (что я на самом деле не хочу делать).Есть ли способ заставить WrappedRequests работать с {AuthRequest: {TokenId = "some guid"} как JSON?

Спасибо.

Ответы [ 2 ]

20 голосов
/ 02 сентября 2011

Имя оболочки - не параметр тип , а параметр имя . Если вы отправите его как {"data":{"TokenId":"some guid"}}, оно должно работать.

Или, если вы хотите использовать другое имя, отличное от имени параметра, вы можете использовать атрибут [MessageParameter]:

[OperationContract]
[WebInvoke(
    Method="POST",
    BodyStyle = WebMessageBodyStyle.WrappedRequest,
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    UriTemplate = "Authenticate")]
public AuthResponse Authenticate([MessageParameter(Name = "AuthRequest")] AuthRequest data)
3 голосов
/ 06 июля 2012

Это поздний ответ, но я надеюсь, что он кому-нибудь поможет.

Я также пытался заставить работать веб-сервис JSON "POST", но его параметр всегда устанавливался как null.Забудьте о попытке десериализации любых данных JSON, там никогда не было над чем работать!

public string CreateNewSurvey(string JSONdata)
{
    if (JSONdata == null)
        return "JSON received: NULL, damn.";
    else
        return "You just sent me: " + JSONdata;
}

Мои веб-службы GET работали великолепно, но этот "POST" сводил меня с ума.

Как ни странно, я решил изменить тип параметра с string to Stream .

public string CreateNewSurvey(Stream JSONdataStream)
{
    StreamReader reader = new StreamReader(JSONdataStream);
    string JSONdata = reader.ReadToEnd();

    //  Finally, I can add my JSON deserializer code in here!

    return JSONdata;
}

... и в моем web.config ...

  [OperationContract(Name = "createNewSurvey")]
  [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "createNewSurvey")]
  string CreateNewSurvey(Stream JSONdata);   

С этим, наконец, мое приложение для iPad можетпозвоните в мою службу WCF.Я был счастливым человеком!Надеюсь, это поможет.

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