【问题标题】:C# Cannot add or modify List in WCFC# 无法在 WCF 中添加或修改列表
【发布时间】:2016-11-23 15:39:21
【问题描述】:

我正在使用有关创建 WCF 服务的教程中的示例代码,但它只工作了一半。当它被硬编码和检索列表工作时,添加到列表工作。但是,使用例程添加或修改列表不起作用。这是代码: 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,所以我完全被难住了。谢谢!

【问题讨论】:

  • 您是否调试过您的 add 和 update 方法以查看它们是否真的被客户端点击以及进入该方法的 book 是否为 null?
  • 我自己使用 WCF 已经有一段时间了,但我猜问题是每次调用 GetBooks 时都会得到一个新的 BookService 实例。您需要确保您的列表是持久的,例如在数据库中。
  • .. 或者只是确保您的范围已修改..
  • 正如@DirkVollmar 指出的那样,每次调用都会创建一个 _books 变量的新实例。您将其定义为静态示例,如下所示:private static List&lt;BookData&gt; _books

标签: c# list wcf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    检查您是否为每个 Wcf 请求创建一个新的BookService。您可以在配置中将InstanceContextMode 更改为Single,或者您可以通过编程方式进行更改,以便为所有请求调用一个实例。您可以谷歌了解如何设置此行为

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 谢谢,成功了!我仍然不知道他们在教程中的何处/如何设置它,但它现在对我有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多