2014-04-25 32 views
0

我有發回MembershipCreateStatusSystem.Web.Security)調用方法WCF服務方法。當我查看服務定義時,它已將enum重新創建爲MyProject.MyWebService.MembershipCreateStatus類型,因此它本質上是一個完全不同的對象。WCF服務創建單獨的代理類

有沒有辦法在這我可以告訴服務定義使用System.Web.Security類代替,即使是這樣的WCF服務中?

回答

0

你就可以了。您需要使用KnownTypeAttribute類裝飾DataContract在您的WCF服務指定枚舉是System.Web.Security.MembershipCreateStatus型的,我不知道你的環境的細節,但在一般的,除非你同時控制WCF服務和消費的客戶,我會仔細研究支持要求以及未來更改enum的可能性,從而導致與使用此枚舉的客戶端存在向後兼容性問題。另外要考慮的是非.NET客戶端可能會使用您的WCF服務的情況。在這種情況下,你需要考慮如果使用System.Web.Security.MembershipCreateStatus枚舉是一個好主意,而不是實現自己的狀態來創建成員。 Here是StackOverflow上的另一個問題,對此主題進行了很好的討論。

例如見下文

[ServiceContract] 
public interface IMembershipService 
{ 
    [OperationContract] 
    CreateMemberResponse CreateMember(ApplicationUser userToCreate); 
} 

[DataContract] 
[KnownType(typeof(System.Web.Security.MembershipCreateStatus))] 
public class CreateMemberResponse 
{ 
    [DataMember] 
    public MembershipCreateStatus Status { get; set; } 
} 

[DataContract] 
public class ApplicationUser 
{ 
    public bool ReturnSuccess { get; set; } 

    public ApplicationUser() 
    { 
     ReturnSuccess = true; 
    } 
} 

下面的代碼,您可以編寫針對該服務的測試如下,本次測試會成功。

[TestClass] 
public class MembershipStatusInvocationTests 
{ 
    [TestMethod] 
    public void CreateMemberShouldReturnMembershipCreateStatusEnum() 
    { 
     var client = new MembershipServiceClient(); 
     var response = client.CreateMember(new ApplicationUser {ReturnSuccess = true}); 

     Assert.IsInstanceOfType(response.Status, typeof(System.Web.Security.MembershipCreateStatus)); 
    } 
} 

有關KnownTypeAttribute類的更多信息,請參閱here