首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在WCF中实现MessageContract?

如何在WCF中实现MessageContract?
EN

Stack Overflow用户
提问于 2014-06-08 04:50:37
回答 1查看 213关注 0票数 0

好吧,就是这样!!我知道我确实犯了一些错误,但我想澄清一些基本问题,我想成功地实现这些错误。我有一个Employee类,它是WCF和FullTimeEmployee中的一个FullTimeEmployee,PartTimeEmployee扩展了这个类。在我的EmployeeService中,我们分别根据控制台应用程序客户端的用户输入返回FullTimeEmployee和PartTimeEmployee的对象(仅用于演示目的)。现在,我想通过MessgaeContract来调整SOAP消息。我希望请求对象被称为EmployeeRequestObject,响应对象EmployeeResponseObject和我希望在它们的头中包含相同的许可密钥。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace EmployeeServiceLibrary
{
[ServiceContract]
public interface IEmployeeService
{
    [OperationContract]
    EmployeeResponse GetEmployee(EmployeeRequest request);
}

#region EmployeeRequestObject

[MessageContract(IsWrapped=true,WrapperName="EmployeeRequestObject",WrapperNamespace="http://Chiranjib_VAIO.com/")]
public class EmployeeRequest
{
    [MessageBodyMember(Namespace = "http://Chiranjib_VAIO.com/")]
    public int EmployeeRequestID { get; set; }

    [MessageHeader(Namespace = "http://Chiranjib_VAIO.com/")]
    public string EmployeeRequestLicenseKey { get; set; }
}
#endregion

#region EmployeeResponseObject
public class EmployeeResponse
{
    public EmployeeResponse()
    {
    }

    public EmployeeResponse(EmployeeRequest e)
    {
        this.EmployeeResponseLicenseKey = e.EmployeeRequestLicenseKey+"_Response";
    }

    [MessageHeader(Namespace = "http://Chiranjib_VAIO.com/")]
    public string EmployeeResponseLicenseKey { get; set; }
}
#endregion

[KnownType(typeof(FullTimeEmployee))]
[KnownType(typeof(PartTimeEmployee))]
[DataContract]
public abstract class Employee
{
    [DataMember]
    public int EmployeeId { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Gender { get; set; }

    [DataMember]
    public EmployeeType EmpType { get; set; }
}

public enum EmployeeType
{
    FullTimeEmployee=0,
    PartTimeEmployee=1
}

[DataContract]
public class FullTimeEmployee : Employee
{
    [DataMember]
    public decimal AnnualSalary { get; set; }
}

[DataContract]
public class PartTimeEmployee : Employee
{
    [DataMember]
    public int HoursWorked { get; set; }

    [DataMember]
    public decimal SalaryPerHour { get; set; }
}
}

当用户输入0时,我希望返回一个FullTimeEmployee对象,当输入一个1时,我希望返回一个PartTimeEmployee对象。这是服务文件

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace EmployeeServiceLibrary
{
public class EmployeeService : IEmployeeService
{
    public EmployeeResponse GetEmployee(EmployeeRequest request)
    {
        int empId = request.EmployeeRequestID;
        switch (empId)
        {
            case 0:
                return new FullTimeEmployee()
                {
                    EmployeeId=1,
                    Name="Chiranjib Nandy",
                    Gender="Male",
                    EmpType=EmployeeType.FullTimeEmployee,
                    AnnualSalary=1500
                };
            case 1:
                return new PartTimeEmployee()
                {
                    EmployeeId = 1,
                    Name = "Archana Nandy",
                    Gender = "Female",
                    EmpType = EmployeeType.PartTimeEmployee,
                    HoursWorked=9,
                    SalaryPerHour=150
                };
            default: return null;
        }
    }
}

}

但错误是说不能隐式地将EmployeeServiceLibrary.FullTimeEmployee转换为EmployeeServiceLibrary.EmployeeResponse。如何达到预期的行为?帮助是非常感谢的!!谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-08 05:07:24

您的代码不会编译,因为您的两个返回类型都实现了Employee,而不是EmployeeResponse。您可以将Employee对象封装在EmployeeResponse中。

代码语言:javascript
复制
public class EmployeeResponse
{
   public EmployeeResponse(EmployeeRequest e)
   {
       this.EmployeeResponseLicenseKey = e.EmployeeRequestLicenseKey+"_Response";
   }

   [MessageHeader(Namespace = "http://Chiranjib_VAIO.com/")]
   public string EmployeeResponseLicenseKey { get; set; }

   public Employee Employee { get; set; }
}

然后将代码修改为:

代码语言:javascript
复制
public EmployeeResponse GetEmployee(EmployeeRequest request)
{
    int empId = request.EmployeeRequestID;
    switch (empId)
    {
        case 0:
            return new EmployeeResponse
            {
               Employee = new FullTimeEmployee()
               {
                 EmployeeId=1,
                 Name="Chiranjib Nandy",
                 Gender="Male",
                 EmpType=EmployeeType.FullTimeEmployee,
                 AnnualSalary=1500
               }
            }
        case 1:
            return new EmployeeResponse
            {
               Employee = new PartTimeEmployee()
               {
                  EmployeeId = 1,
                  Name = "Archana Nandy",
                  Gender = "Female",
                  EmpType = EmployeeType.PartTimeEmployee,
                  HoursWorked=9,
                  SalaryPerHour=150
               }
            }

        default: return null;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24103107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档