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 следующим образом:
- Использование атрибута [MessageHeader] достаточно для членов MessageHeader.
- Если контракт TestsResults не является контрактом верхнего уровня, я бы пометил его как DataContract только с атрибутами DataMember.
РЕДАКТИРОВАТЬ: 3. TestResult также должен быть DataContract, все члены размечены с DataMember. Ваше перечисление должно быть помечено атрибутом EnumMember.
Надеюсь, это поможет.
Да, я тоже столкнулся с той же проблемой и решил ее.
Я решил двумя способами.
При добавлении Service Reference -> Check 'Всегда генерировать контракт сообщения' в опции DataType
Добавьте следующий код в ваш клиент
BasicHttpBinding myBinding = new BasicHttpBinding ();
ChannelFactory factory = new ChannelFactory (myBinding, new EndpointAddress (""));
IContractName client = factory.CreateChannel ();
Надеюсь, это поможет.