Как выглядит xml для завернутого пост-вызова wcf? - PullRequest
0 голосов
/ 20 января 2010

У меня есть служба отдыха wcf с контрактом на операцию, который содержит два значения - int и строку. Это также почтовый звонок.

Если я заверну вызов, используя BodyStyle = WebMessageBodyStyle.Wrapped. Что я должен предположить, что XML-запрос теперь будет выглядеть?

1 Ответ

0 голосов
/ 26 мая 2010

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

Сначала я расскажу вам, как я это сделал.Шаг первый - создать служебную библиотеку, которая содержит определение класса для вашей структуры объекта данных с соответствующими методами get и конструктором для инициализации объекта.Кроме того, вы должны сделать сериализуемый класс, т. Е.

[Serializable]
public class myDataObject
{
    private int _n1;
    private string _s1;

    public myDataObject(int n, string s)
    {
        this._n1 = n;
        this._s1 = s;
    }

    public int getN1()
    {
        return this._n1;
    }
    public string getS1()
    {
        return this._s1;
    }
}

}

Важно поместить это в библиотеку, чтобы вы могли ссылаться на него как со стороны клиента, так и со стороны сервера.

Как только вы это сделаете, измените свой метод обслуживания WCF, чтобы он выглядел примерно так:

[WebInvoke(Method = "POST", UriTemplate = "yourDesignedURI")]
[OperationContract]
public bool doSomething(myDataObject o)
{ 
    //implement your service logic, accessing the parameters from o
    int i = o.getN1();
    string s = o.getS1();
    //...etc
    return true;
}

Когда это будет завершено, опубликуйте свою службу, а затем используйте страницу справки из своей службы, чтобыпросмотреть синтаксис XML, который требуется.Затем вы можете создать свой XML с помощью Linq to XML и, таким образом, отправить ваш объект данных через Интернет в качестве запроса.Это устраняет необходимость в переносе и предоставляет синтаксис вашего запроса XML:

<myDataObject xmlns="http://schemas.datacontract.org/2004/07/DemoXMLSerialization">
    <_n1>2147483647</_n1>
    <_s1>String content</_s1>
</myDataObject>

Ссылка на библиотеку утилит в вашем клиенте и создание метода в ваших данных позже для вызова метода service, создавая элемент в вашем методе.

public void callService(int n1, string s1)
    {
        myDataObject o = new myDataObject(n1, s1);
        string serviceURL = "yourBaseURL";
        string serviceURI = "yourDesignedURI";

        using (HttpClient client = new HttpClient(serviceURL))
        {
            client.DefaultHeaders.Add("Content-Type", "application/xml; charset=utf-8");

            XNamespace xns = "http://schemas.datacontract.org/2004/07/DemoXMLSerialization";
            XDocument xdoc = new XDocument(
                                new XElement(xns + "myDataObject",
                                new XElement(xns + "_n1", o.getN1())
                                , new XElement(xns + "_s1", o.getS1())));
            using (HttpResponseMessage res = client.Post(serviceURI, HttpContent.Create(xdoc.ToString(SaveOptions.DisableFormatting))))
            {
                res.EnsureStatusIsSuccessful();
                //do anything else you want to get the response value
            }
        }
    }

Еще одна вещь, которую вы можете сделать, это изменить ваш URI, чтобы он выглядел примерно так: yourdesignedURI / {myInt} / {myString}

, а затем используйте сериализацию JSON для отправки объекта.Если вы добавите строку

BodyStyle=WebMessageBodyStyle.Bare

в свой атрибут WebInvoke, страница справки предоставит полный URI для удобства просмотра.

Я уверен, что, возможно, есть способ сделать это с JQueryтакже.Хотелось бы увидеть другие решения этой проблемы!

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...