C#无法在WCF

时间:2016-11-23 15:39:21

标签: c# list wcf

我正在使用创建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,所以我完全难过了。谢谢!

3 个答案:

答案 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。这意味着为每个连接创建和维护一个对象。如果您关闭连接然后重新连接,您将有一个新实例,但是您将为服务的每个后续调用处理相同的实例(假设您没有关闭/重新连接)。