Метод WCF-сервиса недоступен в тестовом клиенте WCF, поскольку он использует тип

Я пытаюсь использовать тестовый клиент 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; }
}

Спасибо.

EDIT w/answer...
Операция не была доступна через тестовый клиент WCF, поскольку тип MspWebCallType имел свойство типа Hashtable. Как только я удалил это свойство, он исправил проблему. Спасибо за помощь всем.

Ответы

Ответ 1

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

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

  • Договор дуплекса.

  • сделка.

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

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

Источник: MSDN

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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