从客户端访问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服务继承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"之间共享库
但它的优点是,当接口更改时,在未更改的一侧(客户端或服务器)会出现编译错误
[在理想的世界里可以-接口应该是不可变的;-)]
问候