오케이 이것이 시나리오입니다! 확실히 실수를하고 있음을 알고 있지만 기본 사항을 지우고 성공적으로 구현하려고합니다. WCF의 DataContract 인 Employee 클래스가 있으며 FullTimeEmployee 및 PartTimeEmployee 클래스가 확장됩니다. 내 EmployeeService에서 콘솔 응용 프로그램 클라이언트 (전용 전용)에서 각각 사용자 입력을 기반으로 FullTimeEmployee 및 PartTimeEmployee의 개체를 반환합니다. 이제 MessgaeContract의 SOAP 메시지를 조정하고 싶습니다. 요청 객체를 EmployeeRequestObject라고하고 응답 객체 인 EmployeeResponseObject를 원하고 동일한 라이센스 키를 헤더에 포함하고자합니다.WCF에서 MessageContract를 구현하는 방법은 무엇입니까?
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 개체가 반환 될 입력. 다음은 서비스 파일
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.EmployeeResponse에 EmployeeServiceLibrary.FullTimeEmployee을 변환 할 수 없습니다 말하고있다. 원하는 동작을 달성하는 방법? 도움이 매우 감사합니다! 감사합니다
내가 궁금가 이벤트 컴파일하는 경우, 당신은'반환 Employee'하지만'EmployeeResponse'이 클래스를 기대 공통점이 없다. – Uriil