WCF测试客户端中无法使用WCF服务方法,因为它使用了类型。

14

我正在尝试使用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; }
}

感谢。

附带答案的编辑...
由于MspWebCallType类型有一个Hashtable类型的属性,所以在WCF测试客户端上无法进行该操作。 一旦我删除了这个属性,问题就解决了。 感谢大家的帮助。


WSDL文件是否引用了“Request”类的XSD文件? - M.Babcock
@M.Babcock - 我在 WSDL 中没有看到“Request”类的任何条目。 - thiag0
@kd7 - 当我添加[KnownType]属性时,我会得到以下错误:“属性“KnownType”在此声明类型上无效。它仅在“class、struct”声明上有效。” - thiag0
关于你的回答,评论一下;这是否意味着只有测试客户端不起作用,还是WCF也不支持那种类型?你在WSDL上获取了那种类型吗? - Emil
2
@batmaci Hashtable类型仍然被WCF支持。它是Visual Studio附带的默认测试客户端(WcfTestClient http://msdn.microsoft.com/en-us/library/bb552364(v=vs.110).aspx),不支持该类型。 - thiag0
显示剩余4条评论
4个回答

27
以下是 WCF Test Client 不支持的功能列表:
  • 类型:Stream、Message、XmlElement、XmlAttribute、XmlNode、实现 IXmlSerializable 接口的类型(包括相关的 XmlSchemaProviderAttribute 属性)、XDocument 和 XElement 类型以及 ADO.NET DataTable 类型。

  • Duplex contract。

  • Transaction。

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

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

来源:MSDN

请检查 Msp.FavReadViews 和 Msp.DsReadIndicators 是否符合要求。


Msp.FavReadViews和Msp.DsReadIndicators是在一个引用的类库项目中定义的。它们是简单的枚举,但没有EnumMember属性。我从请求类型中删除了这两个属性,但仍然遇到相同的问题。谢谢。 - thiag0
@igby-largeman 感谢您提供详尽的列表,同时似乎“Type”的类型不受支持。如果您有机会,请将其添加到您的列表中。 - Gent
为什么在这个链接中解释了如何启用流式传输 - Hamid Bahmanabady

0

我遇到了同样的错误,问题在于该类具有System.Drawing.Image属性。我将其从类中删除后,问题得以解决。我将字节数组转换为Base64字符串。


0

在此回答,因为这是目前谷歌上的第一个结果:

除了 @Igby Largeman 的答案之外,如果您在操作或数据合同中使用了不可序列化的类型,则还会收到此错误。

以 .NET 中的 Exception 类为例...

我曾经遇到过这样一种情况:我的团队中的开发人员选择通过 DTO 将 Exception 对象发送回服务的客户端,而不是手动将异常消息放入 DTO 中。Visual Studio 不会在构建时警告您(它真的应该),只有在运行时才会失败。

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

希望这能为某人节省时间。


0

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


我尝试添加一个无参数构造函数,但这并没有解决问题。 - thiag0
那么,WCF测试客户端不支持您的服务定义对您来说是否很重要?它仅适用于相对简单的服务接口。我通常使用SoapUI来测试我的服务。 - petr k.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接