MessageContract - 无效的方法生成

时间:2013-04-26 13:15:58

标签: c# wcf wsdl messagecontract

我有以下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);

为什么?

2 个答案:

答案 0 :(得分:3)

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

  1. 在MessageHeader成员上使用[MessageHeader]属性就足够了。
  2. 如果合约TestsResults不是顶级合约,我会将其标记为仅具有DataMember属性的DataContract。
  3. 编辑: 3. TestResult也应该是DataContract,所有成员都标记为DataMember。您的枚举必须使用EnumMember属性进行标记。

    我希望这会有所帮助。

答案 1 :(得分:0)

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

我已经用两种方式解决了。

  1. 添加服务参考时 - &gt;选中DataType选项

  2. 下的'始终生成消息合同'
  3. 在您的客户端中添加以下代码
    BasicHttpBinding myBinding = new BasicHttpBinding();
    ChannelFactory factory = new ChannelFactory(myBinding,new EndpointAddress(“”));
    IContractName client = factory.CreateChannel();

  4. 我希望这会有所帮助。