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} в качестве параметра.

Другие вопросы по тегам