从客户端访问WCF服务中的类的方法

时间:2015-11-09 21:42:04

标签: c# wcf

我有这个场景,我有一个基类Book,它有两个孩子FictionBook和NonFictionBook,它们都覆盖了ToString方法。目前,这些类在WCF服务解决方案中,并且我在客户端上获得了一个书籍列表(List),但是,在尝试使用子类的.ToString()方法时,我陷入困境。

这是来自客户的代码:

        BookServiceClient bookService = new BookServiceClient("BasicHttpBinding_IBookService");

        List<Book> matchingBooks = new List<Book>();
        matchingBooks = (bookService.SearchBookByTitle(upperBookTitle)).ToList();

        if (matchingBooks.Count > 0)
        {
            int count = 1;
            foreach (Book book in matchingBooks)
            {
                Console.WriteLine("Matching Book " + count + ": " + book.ToString());
                count++;
            }
        } else
        {
            Console.WriteLine("No matching books found");
        }

这是Service中的一个子类,它覆盖了ToString方法。另一个子类NonFictionBook也覆盖了ToString方法,需要从客户端访问:

 namespace BookModels
 {
    [DataContract]
    class FictionBook : Book
    {
       [OperationContract]
       public override string ToString()
       {
          return string.Format("Title: {0}, ISBN: {1}, Author: {2}", title, isbn, author);
       }
    }
 }

因此,简而言之,我想从调用服务的客户端访问ToString方法。

实现这一目标的最佳解决方案是什么?

2 个答案:

答案 0 :(得分:1)

从WCF服务中取出模型.....。您的应用程序和WCF服务是否继承了Book类所在的库。以这种方式使用它。

答案 1 :(得分:0)

<强> 1。正如TheGeekYouNeed所说,你需要共享一个图书馆

在客户端和服务器之间。

<强> 2。但是你还需要在基类上设置多态性

否则您将获得CommunicationException

设置多态性可以序列化派生类型 这意味着可以序列化的派生类在基类上声明。

[DataContract]
[KnownType(typeof(FictionBook))]
[KnownType(typeof(NonFictionBook))]
public abstract class Book

第3。然后,您可以将服务器与ChannelFactory<T>

一起使用
 IBookService client = ChannelFactory<IBookService>.CreateChannel( 
     new BasicHttpBinding(),
     new EndpointAddress("http://localhost:8733/Design_Time_Addresses/BookService/")
 );
 List<Book> books = client.GetBooks();
 foreach (var book in books)
     Console.WriteLine(book);

你可以这样做,因为服务器和客户端共享一个可以放置接口的库 好的,在&#34;之间共享一个库不是SOA&#34; 但它的优点是,当更改接口时,未更改的端(客户端或服务器)上存在编译错误 [在理想世界中确定 - 接口应该是不可变的;-)]

此致