C# WCF测试客户端中的WCF服务方法不可用,因为它使用类型

C# WCF测试客户端中的WCF服务方法不可用,因为它使用类型,c#,.net,wcf,wcftestclient,operationcontract,C#,.net,Wcf,Wcftestclient,Operationcontract,我正在尝试使用WCF测试客户端来测试我构建的WCF服务 该服务有一个方法“SubmitRequest” 加载WCF测试客户端时,该方法将灰显,并显示消息“此操作在WCF测试客户端中不受支持,因为它使用WcfLibrary.Objects.Request类型 下面是类型定义,是否有人看到任何错误 [DataContract] public class Request { [DataMember] public string LoanNumber { get; set; }

我正在尝试使用WCF测试客户端来测试我构建的WCF服务

该服务有一个方法“SubmitRequest”

加载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; }
}
[DataContract]
公共类请求
{
[数据成员]
公共字符串LoanNumber{get;set;}
[数据成员]
公共字符串ClientCode{get;set;}
[数据成员]
公共区域区域{get;set;}
[数据成员]
公共请求类型请求类型{get;set;}
[数据成员]
公共列表请求参数{get;set;}
[数据成员]
公共列表MspWebCallsForXmlRequest{get;set;}
[数据成员]
公共哈希表XmlRequestParameters{get;set;}
公共请求(string LoannNumber、string clientCode、Region Region、RequestType RequestType、List requestParameters)
{
LoannNumber=LoannNumber;
ClientCode=ClientCode;
区域=区域;
RequestType=RequestType;
RequestParameters=RequestParameters;
}
}
[数据合同]
公共类MspWebCallType
{
[数据成员]
公共字符串WebService{get;set;}
[数据成员]
公共字符串操作{get;set;}
[数据成员]
公共字符串版本{get;set;}
[数据成员]
公共哈希表参数{get;set;}
[数据成员]
public Msp.FavReadViews FAVReadViewIndicator{get;set;}
[数据成员]
public Msp.DsReadIndicators dsreadiniindicator{get;set;}
}
[数据合同]
公共枚举区域
{ 
[委员]
P2,
[委员]
戳
}
[数据合同]
公共枚举请求类型
{
[委员]
没有一个
[委员]
XmlRequest,
[委员]
其他请求类型
}
[数据合同]
公共结构请求参数
{
[数据成员]
公共字符串参数名称{get;set;}
[数据成员]
公共字符串参数值{get;set;}
}
谢谢

编辑w/回答…
该操作无法通过WCF测试客户端进行,因为MspWebCallType类型具有Hashtable类型的属性。一旦我删除此属性,它就解决了问题。感谢大家的帮助

以下是WCF测试客户端不支持的功能列表:

  • 类型:流、消息、XmlElement、XmlAttribute、XmlNode和 实现IXmlSerializable接口,包括相关 XmlSchemaProviderAttribute属性,以及XDocument和XElement 类型和ADO.NET数据表类型

  • 双重合同

  • 交易

  • 安全性:CardSpace、证书和用户名/密码

  • 绑定:WSFederationbinding、任何上下文绑定和Https绑定, WebHttpbinding(Json响应消息支持)

资料来源:


检查
Msp.FavReadViews
Msp.DsReadIndicators
以确保它们符合要求。

这可能是因为
Request
需要一个公共的非参数构造函数。

在这里回答,因为这是谷歌目前针对此错误的第一个结果:

除了@Igby Largeman的答案外,如果在操作或数据契约中的某个地方使用了不可序列化的类型,您还将收到此错误

以.NET中的异常类为例

我曾经遇到过这样一个例子:我的团队中的一位开发人员选择通过DTO将异常对象发送回服务的客户端,而不是手动将异常消息放入DTO。Visual Studio在构建时不会警告您(实际上是应该的),该类不可序列化,它只会在运行时失败

因此,如果您收到此错误并排除了上述答案,请确保检查合同和DTO中使用的类型;不可序列化的内容可能是您的罪魁祸首


我希望这能节省一些时间。

我也有同样的错误,问题是该类有System.Drawing.Image属性。我将其从类中删除后,它就工作了。我将字节数组转换为base64字符串。

WSDL是否为'Request'类引用XSD?您是否尝试过:[OperationContract][KnownType(typeof(Request))]Response SubmitRequest(Request-Request);一个问题:您的请求类实际上是否在名称空间WcfLibrary.Objects内?@M.Babcock-我在WSDL中没有看到任何“请求”类的条目。@batmaci哈希表类型仍然受WCF支持。它是Visual Studio(WcfTestClient)附带的默认测试客户端这不支持该类型。Msp.FavReadViews和Msp.DsReadIndicators是在引用的类库项目中定义的。它们是简单的枚举,但没有EnumMember属性。我从请求类型中删除了这两个属性,但仍然遇到相同的问题。谢谢。@igby largeman也感谢深入列表s表示不支持“类型”的类型。如果有机会,请将其添加到列表中。为什么在此链接中解释如何[启用流媒体]()我尝试添加一个无参数构造函数,但这并没有解决问题。那么,WCF测试客户端不支持您的服务定义对您来说有什么大不了的吗?它只适用于相对简单的服务接口。我通常使用SoapUI来测试我的服务。
[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; }
}