Передача XML-строки в тело службы WCF REST с помощью WebInvoke - PullRequest
5 голосов
/ 06 июня 2011

Я новичок в WCF, REST и т. Д. Я пытаюсь написать сервис и клиент.Я хочу передать xml как строку в службу и получить ответ.

Я пытаюсь передать xml в теле метода POST, но когда я запускаю свой клиент, он просто зависает.

Работает нормально, когда я меняю сервис, чтобы принять параметр как часть URI.(когда я изменяю UriTemplate с getString на getString / {xmlString} "и передаю строковый параметр).

Я вставляю приведенный ниже код.

Служба

[ServiceContract]
public interface IXMLService
{
    [WebInvoke(Method = "POST", UriTemplate = "getString", BodyStyle=WebMessageBodyStyle.WrappedRequest, 
    RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]

    [OperationContract]
    string GetXml(string xmlstring);
}

// Код реализации

public class XMLService : IXMLService
{
    public string GetXml(string xmlstring)
    {
        return "got 1";
    } 
}    

Клиент

string xmlDoc1="<Name>";        
xmlDoc1 = "<FirstName>First</FirstName>";
xmlDoc1 += "<LastName>Last</LastName>";
xmlDoc1 += "</Name>";

HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(@"http://localhost:3518/XMLService/XMLService.svc/getstring");
request1.Method = "POST";
request1.ContentType = "application/xml";
byte[] bytes = Encoding.UTF8.GetBytes(xmlDoc1);        
request1.GetRequestStream().Write(bytes, 0, bytes.Length); 

Stream resp = ((HttpWebResponse)request1.GetResponse()).GetResponseStream();
StreamReader rdr = new StreamReader(resp);
string response = rdr.ReadToEnd();

Может кто-нибудь указать, что в этом плохого?

Ответы [ 4 ]

8 голосов
/ 06 июня 2011

Измените свой контракт на работу, чтобы использовать XElement и BodyStyle Bare

[WebInvoke(Method = "POST", 
    UriTemplate = "getString", 
    BodyStyle = WebMessageBodyStyle.Bare,
    RequestFormat = WebMessageFormat.Xml, 
    ResponseFormat = WebMessageFormat.Xml)]
[OperationContract]
string GetXml(XElement xmlstring);

Кроме того, я подозреваю, что код вашего клиента должен содержать (обратите внимание на первый + =):

string xmlDoc1="<Name>";
xmlDoc1 += "<FirstName>First</FirstName>";
xmlDoc1 += "<LastName>Last</LastName>";
xmlDoc1 += "</Name>";
1 голос
/ 05 июня 2012

Вам все еще нужно создать класс:

public class Test
{

    public string xmlstring{ get; set; }

}

Вы также можете использовать fiddler, чтобы проверить, может ли сериализованный XML быть передан в качестве параметра.

0 голосов
/ 06 июня 2011

Вам нужно обернуть строку XML в тег <string/> соответствующим пространством имен сериализации Microsoft XML. На этот вопрос ранее уже давался ответ на SO, но в данный момент я не могу его найти.

0 голосов
/ 06 июня 2011

Я считаю, что проблема в том, что вы устанавливаете BodyStyle в WrappedRequest, что потребует, чтобы ваш входящий XML был обернут в элемент <GetXml> в любом пространстве имен, в котором определен ваш контракт на обслуживание. Если вы установите BodyStyle до Bare и используйте XElement, как @Ladislav Mmka предположил в комментарии, что вы должны быть хорошими.

...