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 ответа

Решение

Я не знаю, может ли это вызвать эту проблему, но я бы пометил свой аналогично структурированный MessageContract следующим образом:

  1. Использование атрибута [MessageHeader] достаточно для членов MessageHeader.
  2. Если контракт TestsResults не является контрактом верхнего уровня, я бы пометил его как DataContract только с атрибутами DataMember.

РЕДАКТИРОВАТЬ: 3. TestResult также должен быть DataContract, все члены размечены с DataMember. Ваше перечисление должно быть помечено атрибутом EnumMember.

Надеюсь, это поможет.

Да, я тоже столкнулся с той же проблемой и решил ее.

Я решил двумя способами.

  1. При добавлении Service Reference -> Check 'Всегда генерировать контракт сообщения' в опции DataType

  2. Добавьте следующий код в ваш клиент
    BasicHttpBinding myBinding = new BasicHttpBinding ();
    ChannelFactory factory = new ChannelFactory (myBinding, new EndpointAddress (""));
    IContractName client = factory.CreateChannel ();

Надеюсь, это поможет.

Другие вопросы по тегам