2016-04-24 32 views
1

WCFサービスの作成が始まり、奇妙な問題が発生しました。クライアントで呼び出されたサービスからのメソッドが正しく機能せず、新しいブックが作成されない理由はわかりません。 listBooks()メソッドidは本のリストを返しますが、メソッドaddBookはbooksListに新しいbookを作成しないため、okです。しかし、この状況は、サービスコンストラクタで呼び出された同じメソッドがブックを作成するため、クライアントからこのメソッドを使用する場合にのみ使用されます。簡単なWCFプログラム、サービスメソッドがクライアントプログラムで動作しない

namespace LibraryClient 
{ 
class Program 
{ 
    static ServiceReference.ServiceClient client; 
    static void Main(string[] args) 
    { 

     client = new ServiceReference.ServiceClient(); 

     client.addBook(2, "some book", "some author"); //this is not working 
     ServiceReference.Book[] books = client.listBooks(); 

     foreach(var book in books) 
     { 
      Console.WriteLine("{0}", book.title); 
     } 

     Console.ReadLine(); 

    } 
} 
} 

とサービスコード:サーバー側で

namespace LibraryService 
{ 

public class Service : IService 
{ 

    private static List<Book> booksList; 
    private static List<User> usersList; 



    public Service() 
    { 
     booksList = new List<Book>(); 
     usersList = new List<User>(); 
     addBook(1, "ANOTHER BOOK", "ANOTHER AUTHOR"); //this is working 


    } 

    public List<Book> listBooks() 
    { 

     return booksList; 
    } 

    public List<User> listUsers() { 
     return usersList; 
    } 

    public void addBook(int id, string title, string author) 
    { 
     booksList.Add(new Book(id,title,author)); 

    } 

    } 
} 

答えて

4

、あなたがサービスを呼び出すたびに、サービスクラスの新しいインスタンスが作成されます。ここ

は、クライアントコードです。新しいインスタンスを作成するということは、このクラスのコンストラクタが呼び出されることを意味します。

そして、ちょうどあなたは、コンストラクタに何をしているかを見て:

booksList = new List<Book>(); 
usersList = new List<User>(); 

は、基本的には以前の呼び出しからそれらの静的リストに格納されている可能性があり、すべてを殺しています。だから、あなたがそれらに格納されている情報は、複数の呼び出し間で保持することを保証するために、一度だけそれらのリストをインスタンス化していることを確認してください。

private static readonly List<Book> booksList = new List<Book>(); 
private static readonly List<User> usersList = new List<User>(); 

public Service() 
{ 
} 

List<T>クラスはスレッドセーフではありませんことを覚えておいてください。つまり、Webサービスへの複数の同時クライアント呼び出しがある場合、このリストでデータが破損する可能性があります。これを防ぐために、アクセスを同期させる必要があります。

private static readonly object syncRoot = new object(); 

public void addBook(int id, string title, string author) 
{ 
    lock (syncRoot) 
    { 
     booksList.Add(new Book(id, title, author)); 
    } 
} 
+0

ありがとうございます...! – Aver

関連する問題