Wcf Client: передача XML-строки в службу WCF REST с помощью WebInvoke
С параметром out для метода Display он работает в браузере, т.е. http://localhost:2617/UserService.svc/test
Когда я добавляю один параметр, я не могу его просмотреть.
У меня есть следующий контракт.
[ServiceContract]
public interface IUserService
{
[OperationContract]
[WebInvoke(Method="PUT",UriTemplate = "/tes/{name}",
BodyStyle=WebMessageBodyStyle.WrappedRequest)]
string Display(string name);
}
public string Display(string name)
{
return "Hello, your test data is ready"+name;
}
Я пытаюсь позвонить, используя следующий код
string url = "http://localhost:2617/UserService.svc/test"; //newuser
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
string xmlDoc1 = "<Display xmlns=\"\"><name>shiva</name></Display>";
req.Method = "POST";
req.ContentType = "application/xml";
byte[] bytes = Encoding.UTF8.GetBytes(xmlDoc1);
req.GetRequestStream().Write(bytes, 0, bytes.Length);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
Stream responseStream = response.GetResponseStream();
var streamReader = new StreamReader(responseStream);
var soapResonseXmlDocument = new XmlDocument();
soapResonseXmlDocument.LoadXml(streamReader.ReadToEnd());
Я не могу получить вывод для этого. Пожалуйста, помогите мне в этом.
2 ответа
Есть несколько вещей, которые не совсем правильны в вашем коде.
клиент
На клиенте вам нужно указать пространство имен, которое будет tempuri, так как вы не объявили явное, поэтому ваш клиентский код должен быть таким:
string url = "http://localhost:2617/UserService.svc/test"; //newuser
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
string xmlDoc1 = "<Display xmlns=\"http://tempuri.org/\"><name>shiva</name></Display>";
req.Method = "POST";
req.ContentType = "application/xml";
byte[] bytes = Encoding.UTF8.GetBytes(xmlDoc1);
req.GetRequestStream().Write(bytes, 0, bytes.Length);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
Stream responseStream = response.GetResponseStream();
var streamReader = new StreamReader(responseStream);
var soapResonseXmlDocument = new XmlDocument();
soapResonseXmlDocument.LoadXml(streamReader.ReadToEnd());
обслуживание
На службе UriTemplate
не совсем верно - вы указываете /tes/{name}
так что будет ожидать URL, как http://localhost:2617/UserService.svc/tes/shiva
но вы хотите опубликовать данные XML в теле, поэтому вы должны изменить это на UriTemplate = "/test"
(Я предполагаю, что вы имели в виду тест, а не тест, как в вашем вопросе).
Кроме того, метод должен быть POST, если вы хотите, чтобы POST данные к нему (клиент должен соответствовать службе, и я предполагаю, что у вас на клиенте то, что вы хотите).
Итак, в заключение, ваш IUserService должен выглядеть так:
[ServiceContract]
public interface IUserService
{
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "/test",
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string Display(string name);
}
Вам все еще нужно создать класс
public class Test
{
public string name { get; set; }
}
Вы также можете использовать fiddler, чтобы проверить, можно ли передать {name:999} в качестве параметра.