wcf中knowntype属性的问题

2023-11-26

我的 wcf 客户端出现以下错误。

NetDispatcherFaultException 未处理。

格式化程序在尝试反序列化消息时引发异常:尝试反序列化参数时出错http://tempuri.org/:GetVehicleResult。 InnerException 消息是“第 1 行位置 266 处出现错误。元素”http://tempuri.org/:GetVehicleResult'包含来自映射到名称的类型的数据'http://schemas.datacontract.org/2004/07/WCFServer:汽车'。解串器不知道映射到该名称的任何类型。考虑使用 DataContractResolver 或将与“Car”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。请参阅 InnerException 了解更多详细信息。

谁能帮我看看哪里出了问题。

WCF服务器


IVehicle
--------
[ServiceContract]   
public interface IVehicleService
{
    [OperationContract]
    Vehicle GetVehicle(int type);

    [OperationContract]
    int GetNumberOfWheels(Vehicle vehicle);
}

车辆服务


[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]   
public class VehicleService : IVehicleService
{        
    public Vehicle GetVehicle(int type)
    {
        switch (type)
        {
            case 0:
                return new Car()
                {
                   ID = 10,
                   Brand = "Volvo",
                   SteeringWheelPosition = "left"
                };

            case 1:
                return new bike()
                {
                    ID = 11,
                    Brand = "Scott",
                    HasFrontWheelBreak = true
                };

            case 2:
                return new Kidsbike()
                {
                    ID = 12,
                    Brand = "Kid Scott",
                    HasFrontWheelBreak = false,
                    HasSupportingWheels = true
                };

            default:
                return null;
        }
    }

    public int GetNumberOfWheels(Vehicle vehicle)
    {
        return vehicle.NoOfWheels;
    }
}

抽象类


[KnownType(typeof(Car))]
[KnownType(typeof(bike))]
[DataContract]
public abstract class Vehicle
{       
    [DataMember]
    public int ID { get; set; }

    abstract public int NoOfWheels { get; }

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

具体类


[DataContract]
public class Car : Vehicle
{          
    override public int NoOfWheels { get { return 4; } }
    [DataMember]
    public string SteeringWheelPosition { get; set; }  
}

[KnownType(typeof(Kidsbike))]
[DataContract]
public class bike : Vehicle 
{           
    override public int NoOfWheels { get { return 2; } }
    [DataMember]
    public bool HasFrontWheelBreak { get; set; }  
}

[DataContract]
public class Kidsbike : bike
{
    [DataMember]
    public bool HasSupportingWheels { get; set; }  
}

WCF客户端


namespace WCFClient
{
    [ServiceContract]   
    public interface IVehicleService
    {
        [OperationContract]       
        Vehicle GetVehicle(int type);

        [OperationContract]       
        int GetNumberOfWheels(Vehicle vehicle);
    } 
}

namespace WCFClient
{
    [KnownType(typeof(Car))]
    [KnownType(typeof(bike))]
    [DataContract]
    public abstract class Vehicle
    {
        [DataMember]
        public int ID { get; set; }

        abstract public int NoOfWheels { get; }
        [DataMember]
        public string Brand { get; set; }
    }
    [DataContract]
    public class Car : Vehicle
    {
        override public int NoOfWheels { get { return 0; } }
        [DataMember]
        public string SteeringWheelPosition { get; set; }
    }

    [KnownType(typeof(Kidsbike))]
    [DataContract]
    public class bike : Vehicle
    {
        override public int NoOfWheels { get { return 0; } }
        [DataMember]
        public bool HasFrontWheelBreak { get; set; }
    }
    [DataContract]
    public class Kidsbike : bike
    {
        [DataMember]
        public bool HasSupportingWheels { get; set; }
    }
}

private void btnGetVehicle_Click(object sender, EventArgs e)
{
    Car carObj = (Car)fclient.GetVehicle(0);          
}

只是在客户端创建代理。我可以成功调用该服务,但响应时出现问题。我尝试使用 Knowntype 属性。这有什么问题吗。


下面的代码工作正常,没有错误。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfService1 {
    [ServiceKnownType(typeof(Car))]
    [ServiceKnownType(typeof(bike))]
    [ServiceKnownType(typeof(Kidsbike))]
    [ServiceContract]
    public interface IVehicleService {
        [OperationContract]
        Vehicle GetVehicle(int type);

        [OperationContract]
        int GetNumberOfWheels(Vehicle vehicle);
    }

      [DataContract]
    public abstract class Vehicle
    {
        [DataMember]
        public int ID { get; set; }

        abstract public int NoOfWheels { get; }
        [DataMember]
        public string Brand { get; set; }
    }
    [DataContract]
    public class Car : Vehicle
    {
        override public int NoOfWheels { get { return 0; } }
        [DataMember]
        public string SteeringWheelPosition { get; set; }
    }

    [KnownType(typeof(Kidsbike))]
    [DataContract]
    public class bike : Vehicle
    {
        override public int NoOfWheels { get { return 0; } }
        [DataMember]
        public bool HasFrontWheelBreak { get; set; }
    }
    [DataContract]
    public class Kidsbike : bike
    {
        [DataMember]
        public bool HasSupportingWheels { get; set; }
    }

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]   
public class VehicleService : IVehicleService
{        
    public Vehicle GetVehicle(int type)
    {
        switch (type)
        {
            case 0:
                return new Car()
                {
                   ID = 10,
                   Brand = "Volvo",
                   SteeringWheelPosition = "left"
                };

            case 1:
                return new bike()
                {
                    ID = 11,
                    Brand = "Scott",
                    HasFrontWheelBreak = true
                };

            case 2:
                return new Kidsbike()
                {
                    ID = 12,
                    Brand = "Kid Scott",
                    HasFrontWheelBreak = false,
                    HasSupportingWheels = true
                };

            default:
                return null;
        }
    }

    public int GetNumberOfWheels(Vehicle vehicle)
    {
        return vehicle.NoOfWheels;
    }
}

}

服务文件:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfService1.VehicleService" CodeBehind="Service1.svc.cs" %>

测试服务:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using WcfService1;

namespace Test {
    class Program {
        static void Main(string[] args) {
            BasicHttpBinding hproxy = new BasicHttpBinding();
            hproxy.MaxReceivedMessageSize = 2147483647;
            hproxy.MaxBufferSize = 2147483647;
            hproxy.MaxBufferPoolSize = 2147483647;
            EndpointAddress eaddrr = new EndpointAddress("http://localhost:62807/Service1.svc");
            ChannelFactory<IVehicleService> CFactoryobj1 = new ChannelFactory<IVehicleService>(hproxy, eaddrr);
            IVehicleService isclientobj1 = CFactoryobj1.CreateChannel(); 
            Car ve = (Car)isclientobj1.GetVehicle(0);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wcf中knowntype属性的问题 的相关文章

  • 使用 json 向 RESTful WCF 发送 Post 请求

    我已经尝试了每种组合来发送请求 以从 jQuery 向 RESTful WCF 发送 POST 请求 有人可以模仿并使其发挥作用吗 代码在这里 http pastebin com Ua97919C http pastebin com Ua9
  • WCF 缓慢的 ServiceHost.Open() 调用

    这是一个与此类似的问题 WCF 服务的 Win32Exception ServiceHost Open https stackoverflow com questions 1542242 win32exception servicehost
  • 模拟 WCF 客户端代理的最佳方法

    有没有办法使用 Rhino 模拟框架来模拟 WCF 客户端代理 以便我可以访问 Channel 属性 我正在尝试对 Proxy Close 方法进行单元测试 但由于代理是使用抽象基类构造的ClientBase
  • WCF 仅跟踪失败的请求?

    我想将跟踪信息保存到 svclog 文件中 但仅限于失败的请求 这可能吗 如果是这样 具体如何 我有一个每分钟调用数百次的 WCF 服务 在极少数情况下 客户端会收到错误 500 该错误发生在 WCF 内运行的代码边界之外 通常是安全问题
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • WCF服务健康状况监控

    我刚刚实现了 WCF 服务 目前正在研究服务监控选项 我们的服务器团队目前仅托管 java 服务 希望我们的实例始终运行 因此它可以在该实例的生命周期内收集数据 他们表示将使用我们的 webmon 操作之一来获取统计信息 但我们正在使用每次
  • 如何保证单向方法的可靠性?

    The 关于单向调用 回调和事件您需要了解的信息 http msdn microsoft com en us magazine cc163537 aspx文章讲述 客户端不关心调用结果的事实并不意味着客户端根本不关心调用是否发生 一般来说
  • 根据拦截和返回值自动重试客户端WCF调用

    是否可以拦截 WCF 调用的结果并重试该操作 例如 操作的返回值可能包含状态代码 指示我传递到原始调用的会话令牌已过期 在这种情况下 我可以检索新的会话令牌并使用新的会话令牌重试调用 是否可以通过使用 WCF 拦截返回值 检查它 然后以对操
  • 从 asp.net mvc ajax 调用 wcf

    我有两个应用程序 第一个是 WCF 服务 第二个是 asp net MVC 3 应用程序 在 WCF 应用程序中我有一个界面 ServiceContract public interface IService1 OperationContr
  • 使用 SOAP 调用 WCF 服务

    我正在尝试在不创建 WCF 客户端的情况下测试 WCF 服务 我有类似的代码 问题here https stackoverflow com a 1643025 1397017 我希望完全控制 SOAP 负载 因此我希望能够发出我自己的 We
  • WCF 与 WebAPI 和本机移动设备

    我一直在开发一个完全基于 ajax 的单页 Web 应用程序 无 POST 现在我在开发过程中使用 ASMX 来提供 Web 服务 Web 服务使用 JSON 数据 对于该版本 我知道我需要升级到 WCF 或 WebAPI 最终 我计划构建
  • WCF 客户端 - 如何处理或忽略 MustUnderstand 标头元素?

    我正在写一个WCF使用 WS Security 使用非 Net Web 服务的客户端 服务的响应包含一个 Security 标头 其中 MustUnderstand 设置为 true 使用 ServiceModelListener 我确实看
  • 为什么我会从 WSDL 调用中得到 System.InvalidOperationException,但不会从对另一个服务的同一调用中得到 System.InvalidOperationException?

    我创建了服务来获取各个客户的国家 地区详细信息 但是在托管该服务时我遇到了此异常 我正在使用基本的 http 绑定 An ExceptionDetail likely created by IncludeExceptionDetailInF
  • Android Json结果处理

    我有这样的 Json 结果 array getJSONObject j 执行代码 WAT2 FreeIssuePrefix DisPaySchedulePrefix NextFreeIssueNo 1 NextReturnNo 20 Upl
  • 如何在 IIS 中将 WCF 与 basichttpbinding only、SSL 和基本身份验证结合使用?

    是否可以仅使用 IIS 中的 SSL 和基本身份验证来设置 WCF 服务BasicHttpBinding binding 我无法使用wsHttpBinding binding 该站点托管在 IIS 7 上 并设置了以下身份验证 匿名访问 O
  • 在方法/数据成员中向 WCF 添加限制

    我是 WCF 新手 我尝试对数据成员添加限制 例如在这个方法中 DataMember public string StringValue get return stringValue set stringValue value 我想设置最大
  • WCF获取证书编码值

    我在 WCF 服务中使用证书 因此在 web Config 中有一个编码值
  • Task.Delay 值得取消吗?

    我最近使用取消模式重新实现了一大堆异步 WCF 服务方法 我在很多地方都看到过这种模式的描述 您可以在其中等待Task WhenAny在已启动的任务和 Task Delay 上 当然 现有任务是不可取消的 但这有望在以后的版本中得到解决 就
  • 如何从Windows服务公开restful接口?

    我编写了一个公开restful接口的wcf服务 现在我使用iis作为wcf服务主机 除了暴露其余部分之外 我还需要对我的应用程序执行一些操作 为此 我必须将我的应用程序作为 Windows 服务运行 但是使用iis作为主机不会使我的wcf服
  • 需要 WCF 的完整 DI 示例

    有人有完整且有效的 WCF DI 示例吗 Every http www eggheadcafe com tutorials aspnet b428fb65 08b4 45c8 97cd 47ee1a1eaf41 composing wcf

随机推荐