0

我有一个 WCF 服务,它使用 XML 有效负载读取请求并响应这些请求。例如,一个简单的登录请求如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LoginRequest>
    <username>test</username>
    <password>foo</password>
</LoginRequest>

现在我知道我可以简单地接受XElement我的服务方法,但是有什么方法可以告诉底层系统如何读取上述 XML 并将其转换为这种格式的函数调用:

public LoginResponse Login (string username, string password); 

这样的事情可能吗?

4

2 回答 2

0

我不相信您指定的 XML 会按原样格式化。我只说这是因为除非您更改传入的 SOAP 消息,否则它会将内部的 XML 识别为单个字符串值(就像您现在一样)而不是多个值。

如果您有一个 .NET 客户端,那么您可能希望在已经知道如何序列化和反序列化为 SOAP 格式的客户端(或代理对象)上使用相同的类,并使用 DataContract 属性进行修饰。由于您没有指定向您发送 XML 有效负载的客户端是什么,因此 XML 很可能已经包装在 SOAP 信封中,并且需要双方进行一些大修才能“更正确”。

此外,由于您在此处进行的操作,您的实际 SOAP 请求必须进行显着更改才能将它们作为参数传递,而不仅仅是 XML 值。

所以,我想最重要的答案是否定的。您将无法单独更改 WCF 服务来执行此操作。

于 2012-10-31T16:39:52.233 回答
0

的,这是可能的。

a)将 xml 更改为

<Login>
     <username>test</username>
     <password>foo</password>
</Login>

b)替换 [ServiceContract][ServiceContract(Namespace = "")]

c)并将方法声明为

[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Xml, 
           ResponseFormat = WebMessageFormat.Xml, 
           BodyStyle = WebMessageBodyStyle.Wrapped)]
public string Login(string username, string password){}

它有效....

这是我用来测试的代码

public void TestWCFService()
{
    //Start Server
    Task.Factory.StartNew(
        (_) =>
        {
            Uri baseAddress = new Uri("http://localhost:8080/Test");
            WebServiceHost host = new WebServiceHost(typeof(TestService), 
                                                     baseAddress);
            host.Open();
        }, null, TaskCreationOptions.LongRunning).Wait();


    //Client
    string xml = @"<Login>
                      <username>test</username>
                      <password>foo</password>
                  </Login>";

    var wc = new WebClient();
    wc.Headers.Add("Content-Type", "application/xml; charset=utf-8");
    var result = wc.UploadString("http://localhost:8080/Test/Login", xml);
}

[ServiceContract(Namespace = "")]
public class TestService
{
    [OperationContract]
    [WebInvoke(RequestFormat = WebMessageFormat.Xml, 
               ResponseFormat = WebMessageFormat.Xml, 
               BodyStyle = WebMessageBodyStyle.Wrapped)]
    public string Login(string username, string password)
    {
        return username + " " + password;
    }
}
于 2012-10-31T22:03:58.060 回答