C#WPF服务自定义请求格式



我有一个wcf serivce,它读取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); 

是可能的吗?

我不相信您指定的XML会按原样进行操作。我只这么说,因为除非您更改肥皂消息开始,否则它将识别内部的XML为单个字符串值(似乎您现在拥有)而不是多个值。

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

此外,由于您要去这里的目标,您的实际肥皂请求必须大大更改才能将这些请求作为参数而不仅仅是XML值。

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

这是可能的。

a)将XML更改为

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

b)[ServiceContract(Namespace = "")]

替换[ServiceContract]

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;
    }
}