我正在使用创建WCF服务教程中的示例代码,它只有一半有用。当硬件编码并检索List工作时,添加到List工作。但是,使用例程添加或修改列表不起作用。这是代码: BookData.cs
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,所以我完全难过了。谢谢!
答案 0 :(得分:2)
默认情况下,Wcf会在每次调用时创建一个新实例。每当您在客户端上拨打该服务时,您的列表将始终拥有两本硬编码书。
答案 1 :(得分:1)
检查是否为每个Wcf请求创建新的BookService
。您可以在配置中将InstanceContextMode
更改为Single
,也可以以编程方式执行此操作,以便只为所有请求调用一个实例。您可以谷歌了解如何设置此行为
答案 2 :(得分:0)
尝试更改BookService.cs的服务行为。
[ServiceBehavior( ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.Single )]
public class BookService : IBookService{...}
这会将其更改为单个对象。换句话说,只创建了一个服务实例。
您也可以使用InstanceContextMode = InstanceContextMode.PerSession。这意味着为每个连接创建和维护一个对象。如果您关闭连接然后重新连接,您将有一个新实例,但是您将为服务的每个后续调用处理相同的实例(假设您没有关闭/重新连接)。