Метод службы WCF недоступен в тестовом клиенте WCF, поскольку он использует тип - PullRequest
14 голосов
/ 20 декабря 2011

Я пытаюсь использовать тестовый клиент WCF для тестирования созданной мной службы WCF.

Сервис имеет один метод «SubmitRequest».

[OperationContract]
Response SubmitRequest(Request request);

Когда я загружаю тестовый клиент WCF, метод отображается серым цветом с сообщением «Эта операция не поддерживается в тестовом клиенте WCF, поскольку он использует тип WcfLibrary.Objects.Request

Ниже приведено определение типа, кто-нибудь видит что-то не так?

[DataContract]
public class Request
{
    [DataMember]
    public string LoanNumber { get; set; }

    [DataMember]
    public string ClientCode { get; set; }

    [DataMember]
    public Region Region { get; set; }

    [DataMember]
    public RequestType RequestType { get; set; }

    [DataMember]
    public List<RequestParameter> RequestParameters { get; set; }

    [DataMember]
    public List<MspWebCallType> MspWebCallsForXmlRequest { get; set; }

    [DataMember]
    public Hashtable XmlRequestParameters { get; set; }

    public Request(string loanNumber, string clientCode, Region region, RequestType requestType, List<RequestParameter> requestParameters)
    {
        LoanNumber = loanNumber;
        ClientCode = clientCode;
        Region = region;
        RequestType = requestType;
        RequestParameters = requestParameters;
    }
}

[DataContract]
public class MspWebCallType
{
    [DataMember]
    public string WebService { get; set; }
    [DataMember]
    public string Operation { get; set; }
    [DataMember]
    public string Version { get; set; }
    [DataMember]
    public Hashtable Parameters { get; set; }
    [DataMember]
    public Msp.FavReadViews FAVReadViewIndicator { get; set; }
    [DataMember]
    public Msp.DsReadIndicators DSReadInidicator { get; set; }        
}

[DataContract]
public enum Region 
{ 
        [EnumMember]
        P2,
        [EnumMember]
        PROD 
}

[DataContract]
public enum RequestType
{
    [EnumMember]
    None,
    [EnumMember]
    XmlRequest,
    [EnumMember]
    SomeOtherRequestType
}

[DataContract]
public struct RequestParameter
{
    [DataMember]
    public string ParameterName { get; set; }

    [DataMember]
    public string ParameterValue { get; set; }
}

Спасибо.

РЕДАКТИРОВАТЬ с ответом ...
Операция не была доступна через тестовый клиент WCF, поскольку тип MspWebCallType имел свойство типа Hashtable. Как только я удалил это свойство, это решило проблему. Спасибо всем за помощь.

Ответы [ 4 ]

27 голосов
/ 20 декабря 2011

Ниже приведен список функций, не поддерживаемых тестовым клиентом WCF:

  • Типы: Stream, Message, XmlElement, XmlAttribute, XmlNode, типы, которые реализуют интерфейс IXmlSerializableвключая связанный атрибут XmlSchemaProviderAttribute, а также типы XDocument и XElement и тип ADO.NET DataTable.

  • Дуплексный контракт.

  • Транзакция.

  • Безопасность: CardSpace, Сертификат и Имя пользователя /Пароль.

  • Привязки: привязка WSFederation, любые привязки к контексту и привязка Https, привязка WebHttp (поддержка сообщений ответа Json).

Источник: MSDN

Проверьте Msp.FavReadViews и Msp.DsReadIndicators, чтобы убедиться, что они соответствуют.

0 голосов
/ 01 мая 2017

У меня была та же ошибка, и проблема была в том, что у класса было свойство System.Drawing.Image.Я удаляю это из класса, и это работало.Я преобразую массив байтов в строку base64.

0 голосов
/ 06 октября 2016

Ответ здесь, так как это первый результат в Google в настоящее время для этой ошибки:

В дополнение к ответу @Igby Largeman, вы также получите эту ошибку, если где-то в вашей операции или контрактах с данными вы использовали тип, который не сериализуем.

Взять пример класса Exception в .NET ...

У меня был случай, когда разработчик из моей команды решил отправить объект Exception клиенту службы через DTO, а не помещать сообщение об исключении в DTO вручную. Visual Studio не предупредит вас во время сборки (на самом деле, это должно быть), что класс не сериализуем, он выйдет из строя только во время выполнения.

Так что, если вы получаете эту ошибку и исключили ответ выше, убедитесь, что вы проверяете типы, используемые в ваших контрактах и ​​DTO; что-то не сериализуемое может быть вашим виновником.

Надеюсь, это сэкономит кому-то время.

0 голосов
/ 20 декабря 2011

Это может быть связано с тем, что Request должен иметь открытый непараметрический конструктор.

...