对于包装的wcf post调用,xml是什么样的?

时间:2010-01-19 21:33:44

标签: xml wcf post

我有一个wcf restful服务,其操作契约包含两个值 - 一个int和一个字符串。这也是一个帖子。

如果我使用BodyStyle = WebMessageBodyStyle.Wrapped包装调用。我应该假设xml请求现在看起来像什么?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我相信有几种方法可以考虑这样做。如果有更多我喜欢听别人的话。

首先,我会告诉你我是如何做到这一点的。第一步是构建一个实用程序库,其中包含数据对象结构的类定义,并使用适当的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语法。然后,您可以使用Linq to XML构建XML,从而通过Web发送数据对象作为请求。这消除了包装和公开请求xml语法的需要:

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

引用客户端中的实用程序库,稍后在数据中创建一个方法来调用服务方法,在方法中创建元素。

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 / {明特} / {的myString}

然后使用JSON Serialization发送对象。如果添加行

BodyStyle=WebMessageBodyStyle.Bare

对于您的WebInvoke属性,帮助页面将公开完整的URI以便于查看。

我确信可能还有一种方法可以使用JQuery。很想看到其他解决方案!

希望有所帮助。