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

本文关键字:方法 服务 客户端 访问 WCF | 更新日期: 2023-09-27 18:21:26

我有这样的场景,其中我有一个基类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");
        }

这是服务中重写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方法。

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

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

从WCF服务中取出模型。。。。。让你的应用程序和WCF服务继承Book类所在的库。这样使用它。

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);

您可以这样做,因为服务器和客户端共享一个可以放置接口的库
好吧,在"不是SOA"之间共享库
但它的优点是,当接口更改时,在未更改的一侧(客户端或服务器)会出现编译错误
[在理想的世界里可以-接口应该是不可变的;-)]

问候