RestSharp разместить объект в WCF - PullRequest
1 голос
/ 01 апреля 2012

У меня проблема с отправкой объекта в мою веб-службу REST WCF.

На стороне WCF у меня есть следующее:

[WebInvoke(UriTemplate = "", Method = "POST")]
public void Create(myObject object)
{
//save some stuff to the db
}

При отладке точка останованикогда не срабатывает. Однако точка останова достигается, когда я удаляю параметр. Итак, я предполагаю, что я сделал что-то не так со стороны RestSharp.

Вот мой код для этой части:

var client = new RestClient(ApiBaseUri);
var request = new RestRequest(Method.POST);       

request.RequestFormat = DataFormat.Xml;        

request.AddBody(myObject);

var response = client.Execute(request);

Я делаю это неправильно?Как сторона WCF может видеть мой объект?Каким образом я должен сделать запрос?Или я должен обращаться с этим по-другому на стороне WCF?

То, что я пробовал:

request.AddObject(myObject);

и

request.AddBody(request.XmlSerialise.serialise(myObject));

Любая помощь и понимание того, что можетвозможно будет неправильно, будет высоко ценится.Спасибо.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2012

Я боролся с той же проблемой. Как только вы пытаетесь добавить объект для передачи, он становится «Плохой запрос». Я пробовал разные вещи на основе разных сайтов, которые нашел и ничего не получил. Затем я изменил формат с Xml на Json, и он только начал работать. Должен быть какой-то глюк с передачей XML. Возможно, потребуется настроить второй компьютер и попытаться прослушать фактический http с помощью что-то вроде wireshark или fiddler. (Или, может быть, я просто буду придерживаться JSON)

Ниже приведена функция из моего экспериментального интерфейса WCF

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "manualselect", ResponseFormat = WebMessageFormat.Json)]
    void PostManualSelect(ManualUpdateRequest S);

тогда мой тестовый клиент RestSharp

            var client = new RestClient();
        client.BaseUrl = "http://127.0.0.1:8000";
        /* Initialization of ManualUpdateRequest instance "DR" here */

        var request = new RestRequest(Method.POST);
        request.Resource = "manualselect";
        request.RequestFormat = DataFormat.Json;
        request.AddBody(DR);
        RestResponse response = client.Execute(request);

Возможно, кто-то может пролить свет на этот вопрос. Я также новичок в услугах REST. Я думал, что добавлю свои выводы, чтобы лучше ответить.

( - EDIT - ) Я еще покопался и нашел этот кусок Поэтому я добавил атрибут [XmlSerializerFormat] в интерфейс ServiceContract следующим образом:

[ServiceContract]
[XmlSerializerFormat]
public interface IMyRestService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "manualselect", ResponseFormat = WebMessageFormat.Xml)]
    void PostManualSelect(ManualUpdateRequest S);
}

и, наконец, это сработало, и я получил объект в моем сервисе

            var client = new RestClient();
        client.BaseUrl = "http://127.0.0.1:8000";
        /* Initialization of ManualUpdateRequest instance "DR" here */

        var request = new RestRequest(Method.POST);
        request.Resource = "manualselect";
        request.RequestFormat = DataFormat.Xml;
        request.AddBody(DR);
        RestResponse response = client.Execute(request);

( - РЕДАКТИРОВАТЬ 2 - ) Я столкнулся с еще одной странностью сериализации XML, которая заставила меня сделать это расширение (заимствование из здесь ). Может помочь, если у вас все еще есть проблемы. Здесь также есть ответ здесь , который подразумевает, что вам нужно использовать общедоступные свойства для правильной сериализации, который я еще не пробовал.

public static class RestSharpExtensions
{
    public static T GetXmlObject<T>(this IRestResponse response)
    {
        if (string.IsNullOrEmpty(response.Content))
        {
            return default(T);
        }

        XmlSerializer serializer = new XmlSerializer(typeof(T));

        XmlReaderSettings settings = new XmlReaderSettings();
        // No settings need modifying here

        using (StringReader textReader = new StringReader(response.Content))
        {
            using (XmlReader xmlReader = XmlReader.Create(textReader, settings))
            {
                return (T)serializer.Deserialize(xmlReader);
            }
        }
    }

    public static void UseDotNetXml(this IRestRequest request)
    {
        request.RequestFormat = DataFormat.Xml;
        request.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer();
    }

}

Так что мои звонки RestSharp начинают выглядеть примерно так

    public SimpleSignUpdateDataSet GetSimpleDataset()
    {
        var client = new RestClient(SerivceURL);

        var request = new RestRequest("simpledataset", Method.GET);
        request.UseDotNetXml();

        var resp = client.Execute(request);
        return resp.GetXmlObject<SimpleSignUpdateDataSet>();
    }

Этот ответ становится длинным, но я надеюсь, что он кому-нибудь поможет.

0 голосов
/ 25 марта 2013

вы можете использовать Fiddler на том же компьютере .... нет необходимости во втором. Если вы установите его, решение таких проблем станет намного проще, вы увидите, что делаете!

Укажите прокси как это:

using system.net; // for the WebProxy

RestClient rc = new RestClient(aUrl);
rc.Proxy = new WebProxy("http://127.0.0.1:8888");
...