Службы WCF Restful получают ошибку 400 (неверный запрос) при отправке данных xml

Я пытаюсь самостоятельно разместить службы WCF и вызывать службы через javascript. Это работает, когда я передаю данные запроса через Json, но не через xml (400 неверных запросов). Пожалуйста помоги.

Договор:

public interface iSelfHostServices
{

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = INFOMATO.RestTemplate.hello_post2,RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Wrapped)]
    Stream hello_post2(string helloString);

}

Код на стороне сервера:

public Stream hello_post2(string helloString)
{
    if (helloString == null)
    {
        WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.BadRequest;
        return null;
    }
    WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
    return new MemoryStream(Encoding.UTF8.GetBytes(helloString));

}

JavaScript:

function testSelfHost_WCFService_post_Parameter() {

   var xmlString = "<helloString>'hello via Post'</helloString>";
   Ajax_sendData("hello/post2", xmlString);
}

function Ajax_sendData(url, data) {
   var request = false;
   request = getHTTPObject();
   if (request) {
       request.onreadystatechange = function() {
       parseResponse(request);
       };

       request.open("post", url, true);
       request.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); charset=utf-8"); 
       request.send(data);
       return true;
   }
}

function getHTTPObject() {
   var xhr = false;
   if (window.XMLHttpRequest) {
      xhr = new XMLHttpRequest();
      } else if (window.ActiveXObject) {...}
}

person Wayne Lo    schedule 16.06.2010    source источник


Ответы (2)


Это связано с тем, что WCF ожидает, что передаваемая вами строка будет сериализована с использованием пространства имен сериализации Microsoft. Если вы отправите,

<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'>hello via Post</string>

тогда он, вероятно, будет правильно десериализован.

person Darrel Miller    schedule 16.06.2010
comment
Даррел, спасибо. Я попробовал ваше предложение. Но у меня всё тот ​​же код ошибки 400. По каким-то причинам, если я передавал какие-либо параметры через xml, сервисы не распознавали функцию. Если я модифицировал функцию так, чтобы не передавались никакие параметры, функция вызывалась успешно. Любые другие предложения? - person Wayne Lo; 17.06.2010
comment
@Wayne Попробуйте поместить строку в раздел CDATA. - person Darrel Miller; 19.06.2010

Вам необходимо установить стиль тела на Bare в атрибуте WebInvoke, как показано во фрагменте ниже, при отправке тегов XML, как вы отправили выше.

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = INFOMATO.RestTemplate.hello_post2,RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
Stream hello_post2(string helloString);
person Jenish Rabadiya    schedule 23.04.2013