【问题标题】:MessageContract - invalid method generationMessageContract - 无效的方法生成
【发布时间】:2013-04-20 16:28:21
【问题描述】:

我有以下 wcf 服务:

[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; }
}

但是,当我通过添加服务引用生成 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);

为什么?

【问题讨论】:

    标签: c# wcf wsdl messagecontract


    【解决方案1】:

    是的,我也遇到了同样的问题并解决了。

    我已经通过两种方式解决了。

    1. 添加服务参考时 -> 在 DataType 选项下勾选“始终生成消息合同”

    2. 在您的客户端中添加以下代码
      BasicHttpBinding myBinding = new BasicHttpBinding();
      ChannelFactory factory = new ChannelFactory(myBinding, new EndpointAddress(""));
      IContractName 客户端 = factory.CreateChannel();

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我不知道这是否会导致此问题,但我会将类似结构的 MessageContract 标记如下:

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

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

      我希望这会有所帮助。

      【讨论】:

      • 感谢您的建议。我通过使 messageContract 包含一种包含所有必需字段的复杂类型来解决我的问题。这是允许的 - 我认为它不是
      • 很高兴我的 cmets 帮助您找出解决方案!
      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2014-10-08
      • 2021-10-12
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      相关资源
      最近更新 更多