Передача XML-строки в тело службы WCF REST с помощью WebInvoke
Я новичок в 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 ответа
Измените контракт на эксплуатацию, чтобы использовать XElement и BodyStyle of 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>";
Вам все еще нужно создать класс:
public class Test
{
public string xmlstring{ get; set; }
}
Вы также можете использовать fiddler, чтобы проверить, может ли сериализованный XML быть передан в качестве параметра.
Я считаю, что проблема в том, что вы устанавливаете BodyStyle
в WrappedRequest
который потребует, чтобы ваш входящий XML был обернут в <GetXml>
элемент в любом пространстве имен, в котором определен ваш сервисный контракт. Если вы установите BodyStyle
в Bare
и используйте XElement, как @Ladislav Mmka предположил в комментарии, что вы должны быть готовы.
Вы должны обернуть свою строку XML в <string/>
тег с соответствующим пространством имен сериализации Microsoft XML. На этот вопрос уже был дан ответ здесь на SO, но я не могу найти его в данный момент.