2016-11-23 18 views
0

我正在使用创建WCF服务教程的示例代码,它只有一半的作品。当它被硬编码并且检索列表工作时,添加到列表工作。但是,使用例程添加或修改列表不起作用。下面是代码: BookData.csC#无法添加或修改WCF列表

using System.Runtime.Serialization; 

namespace BookServicesV2 
{ 
    [DataContract] 

    public class BookData 
    { 
     [DataMember] 
     public int BookID { get; set; } 
     [DataMember] 
     public string Title { get; set; } 
     [DataMember] 
     public string Author { get; set; } 
     [DataMember] 
     public decimal Price { get; set; } 
    } 
} 

BookService.cs:

using System.Collections.Generic; 


    namespace BookServicesV2 
    { 
     // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together. 
    public class BookService : IBookService 
    { 
     private List<BookData> _books; 

     private BookService() 
     { 
      _books = new List<BookData>(); 

      var book = new BookData { BookID = 1, Author = "Shakespeare", Title = "To Be or Not To Be", Price = 1.49M }; 
      _books.Add(book); 

      book = new BookData { BookID = 2, Author = "Mark Twain", Title = "Not Dead Yet", Price = 3.50M }; 
      _books.Add(book); 
     } 

     #region IBookService Members 

     public void AddBook(BookData book) 
     { 
      if (book != null) _books.Add(book); 
     } 

     public void UpdatePrices(decimal increaseAmmount) 
     { 
      foreach (var book in _books) 
      { 
       book.Price += increaseAmmount; 
      } 
     } 

     public List<BookData> GetBooks() 
     { 
      return _books; 
     } 

     #endregion 
    } 
} 

当我启动WCF测试客户端,GetBooks检索两个硬编码的书籍。当我使用AddBook或UpdatePrices,然后GetBooks时,没有任何改变。我基本上是在学C#和WCF,所以我完全陷入了困境。谢谢!

+5

你有没有调试你的添加和更新方法,看看它们是否真的被客户端击中,以及进入方法的书是否为空? – Jakotheshadows

+1

已经有一段时间我自己使用WCF了,但我猜想问题在于,每次调用GetBooks时都会得到一个新的'BookService'实例。您需要确保您的列表已被保留,例如在数据库中。 –

+0

..或者只是确保你的范围被修改.. – gravity

回答

0

尝试更改BookService.cs的服务行为。

[ServiceBehavior( ConcurrencyMode = ConcurrencyMode.Multiple, 
        InstanceContextMode = InstanceContextMode.Single)] 
public class BookService : IBookService{...} 

这会将其更改为单例对象。换句话说,只有1个服务实例被创建。

您也可以使用InstanceContextMode = InstanceContextMode.PerSession。这意味着每个连接都会创建并维护一个对象。如果您关闭连接,然后重新连接,您将拥有一个新实例,但对于您对该服务进行的每次后续调用(假设您未关闭/重新连接),您都将处理相同的实例。

+0

谢谢,这样做!我仍然不知道它们在教程中的位置/方式,但现在它适用于我。 – JEtheDBA

1

检查是否创建新的BookService对于每个Wcf请求。您可以在配置中将InstanceContextMode更改为Single,或者可以以编程方式执行该操作,以便只为所有请求调用一个实例。你可以谷歌如何设置此行为

2

Wcf默认情况下在每次调用时创建一个新的实例。每次你打电话给客户服务时,你的清单都会有两本硬编码的书。