I'm a newbie to WCF, REST etc. I'm trying to write a service and a client. I want to pass xml as string to the service and get some response back.
I am trying to pass the xml in the body to the POST method, but when I run my client, it just hangs.
It works fine when I change the service to accept the parameter as a part of the uri. (when I change UriTemplate from "getString" to "getString/{xmlString}" and pass a string parameter).
I'm pasting the code below.
[ServiceContract]
public interface IXMLService
{
[WebInvoke(Method = "POST", UriTemplate = "getString", BodyStyle=WebMessageBodyStyle.WrappedRequest,
RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
[OperationContract]
string GetXml(string xmlstring);
}
// Implementaion Code
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();
Could somebody please point out what's wrong in it?
Change your operation contract to use an XElement and the BodyStyle of Bare
[WebInvoke(Method = "POST",
UriTemplate = "getString",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml)]
[OperationContract]
string GetXml(XElement xmlstring);
Additionally I suspect you client code should contain (note the first +=):
string xmlDoc1="<Name>";
xmlDoc1 += "<FirstName>First</FirstName>";
xmlDoc1 += "<LastName>Last</LastName>";
xmlDoc1 += "</Name>";