【问题标题】:Add namespace to element and serialize without alias将命名空间添加到元素并在没有别名的情况下进行序列化
【发布时间】:2019-08-03 02:25:08
【问题描述】:

我想为包装器设置一个命名空间。但不是用别名序列化它,我需要它在包装元素本身上。

我得到的是跟随

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:my-namepsace.com/asdf">
   <soapenv:Header/>
   <soapenv:Body>
     <urn:YVDMS_TASK>
        ...
     </urn:YVDMS_TASK>
   </soapenv:Body>
<soapenv:Envelope>

但我想要这样:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
     <YVDMS_TASK xmlns="urn:my-namepsace.com/asdf">
        ...
     </YVDMS_TASK>
   </soapenv:Body>
<soapenv:Envelope>

这可能吗?

【问题讨论】:

  • 是的,这是可能的。我认为您正在将命名空间添加到序列化程序,而不是将 URL 添加到类。添加到序列化程序时,它会将命名空间放在根目录中,而不是放在适当的后代中。
  • “我需要它位于包装元素本身。”强烈建议处理此问题的任何内容都没有正确构建。从 XML 信息的角度来看,这两个示例是相同的。这意味着有人手工编写了一些 XML 处理代码,可能使用字符串修饰,而不是使用 设计 用于处理 XML 的工具。
  • 是的。我不认为另一部分真的符合规范

标签: c# xml wcf


【解决方案1】:

第一张图片指定了ServiceContract的命名空间,要指定你的body的命名空间,你可以试试消息契约。 但是要注意返回的类型也应该有 MessageContract 属性。

下面是我的代码。

 [MessageContract(WrapperNamespace = "www.message.com")]

public class Employee
{
    [MessageBodyMember(Namespace = "www.message.com")]
    public string Id { get; set; }
    [MessageBodyMember(Namespace = "www.message.com")]
    public string Name { get; set; }
    [MessageBodyMember(Namespace = "www.message.com")]
    public string Department { get; set; }
    [MessageBodyMember(Namespace = "www.message.com")]
    public string Grade { get; set; }
}


[ServiceContract]
public interface IEmployeeService
{
   [OperationContract]
    Employee GetEmployee(Employee employee);
}

 public class EmployeeService : IEmployeeService
{
    public Employee GetEmployee(Employee employee)
    {
        return employee;
    }
}

当我在客户端调用服务时

  using (ChannelFactory<IEmployeeService> ChannelFactory = new ChannelFactory<IEmployeeService>("emp"))
        {
            // ChannelFactory.Endpoint.EndpointBehaviors.Add(new MyEndpointBehavior());
            IEmployeeService employeeService = ChannelFactory.CreateChannel();
            employeeService.GetEmployee(new Employee() { Name = "abc", Department = "dep", Grade = "male", Id = "1er" });
            // List<Employee> list=  employeeService.GetList();
            Console.Read();
        }

结果。

更多信息请参考https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-message-contracts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2019-11-17
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多