2013-04-26 65 views
4

我有以下WCF服务:MessageContract - 无效的方法产生

[ServiceContract] 
public interface IUnitTestingService 
{ 
    [OperationContract] 
    TestsResult ExecuteUnitTests(UploadRequest unitTestsExecutionData); 

} 


// Use a data contract as illustrated in the sample below to add composite types to service operations. 

public class TestResult 
{ 
    public enum TestRunResult 
    { 
     Passed=1, 
     Failed=2, 
     Exception=3 
    } 

    public string TestName { get; set; } 

    public string StartTime { get; set; } 

    public string EndTime { get; set; } 

    public string Result { get; set; } 

} 

[MessageContract(WrapperName = "TestResult"), DataContract] 
public class TestsResult 
{ 
    [MessageHeader, DataMember] 
    public List<TestResult> Results { get; set; } 

    [MessageHeader, DataMember] 
    public int TotalExecutedTests { get; set; } 

    [MessageHeader, DataMember] 
    public int TotalPassedTests { get; set; } 

    [MessageHeader] 
    public int TotalFailedTests { get; set; } 
} 

[MessageContract] 
public class UploadRequest 
{ 
    [MessageHeader(MustUnderstand = true)] 
    public UnitTestingFrameworkType UnitTestingFrameworkType { get; set; } 

    [MessageBodyMember(Order = 1)] 
    public Stream Stream { get; set; } 
} 

但是当我通过附加服务REFFERENCE生成WCF客户端类我得到这个:

public UTS.ServiceReference1.TestResult[] ExecuteUnitTests(UTS.ServiceReference1.UnitTestingFrameworkType UnitTestingFrameworkType, System.IO.Stream Stream, out int TotalExecutedTests, out int TotalFailedTests, out int TotalPassedTests) 

,而不是这样的:

TestsResult ExecuteUnitTests(UploadRequest unitTestsExecutionData); 

为什么?

回答

3

我不知道这是否会造成这个问题,但我会记住我的类似结构的MessageContract起来如下:

  1. 使用[的MessageHeader]属性是不够的的MessageHeader成员。
  2. 如果合同TestsResults不是顶级合同,我会将其标记为仅具有DataMember属性的DataContract。

编辑: 3. TestResult应该也是一个DataContract,所有成员都用DataMember标记。您的枚举必须用EnumMember属性标记。

我希望这会有所帮助。

+0

感谢您的建议。我通过使messageContract包含一个包含所有必需字段的复杂类型来解决我的问题。这是允许的 - 我认为这不是 – seeker 2013-04-26 15:32:48

+0

我很高兴我的意见帮助你找出解决方案! – gabnaim 2013-04-26 15:37:25

0

是的,我也面临同样的问题,并解决它。

我解决了两种方式。

  1. 虽然增加服务参考 - >检查 '始终生成消息协定' 项下数据类型选项

  2. 添加以下代码在客户端
    basicHttpBinding的myBinding =新basicHttpBinding的();
    ChannelFactory factory = new ChannelFactory(myBinding,new EndpointAddress(“”));
    IContractName client = factory.CreateChannel();

我希望这会有所帮助。