0

クライアント アプリケーションで項目 ID を入力すると、WCF サーバーは type のオブジェクトを返すことになっていますItemDTO。ただし、応答が行われると、オブジェクトは空になります。

ItemDTO itm = Connection.Instance.HttpProxy.GetItem(ItemID);

これまでに確認できること:

  • 要求されたアイテムはデータベースから正常に取得されました
  • マッピングは機能しました(結果のマッピングの内容を確認しました)
  • 内容は確かに送信されました(Fiddlerを使用して確認) ここに画像の説明を入力

  • しかし、中身を確認するとitm空っぽ。

これはGetItem()、WCF サーバーのメソッドです。

public ItemDTO GetItem(string itemID) {
    using (var db = new PoSEntities()) {
        var query = from i in db.Items
                    where i.ItemID.Equals(itemID)
                    select i;
        Item item = query.FirstOrDefault();
        return item == null ? null : Mapping.Map<Item, ItemDTO>(item);
    }
}

AutoMapper を使用してエンティティ オブジェクトを DTO にマップします。

    public static H Map<T, H>(T i) {
        Mapper.CreateMap<T, H>();
        return Mapper.Map<T, H>(i);
    }

Itemクラスは Entity Framework によって生成されます。

public partial class Item
{
    public Item()
    {
        this.Sal1 = new HashSet<Sal1>();
    }

    public string ItemID { get; set; }
    public string Name { get; set; }
    public string Manufacturer { get; set; }
    public int StockQuantity { get; set; }
    public decimal Price { get; set; }

    public virtual ICollection<Sal1> Sal1 { get; set; }
}

接続クラス:

 public sealed class Connection {

    private readonly string _address = "http://Edwin:8080/PoS";
    private static Connection _instance;
    private static object _padLock = new Object();
    private static ChannelFactory<IPoS> httpFactory;

    private static IPoS _httpProxy; //Singleton
    public IPoS HttpProxy { get { return _httpProxy; } }

    public static Connection Instance {
        get {
            if (_instance == null) {
                lock (_padLock) {
                    if (_instance == null) {
                        _instance = new Connection();
                    }

                }
            }
            return _instance;
        }
    }

    private Connection() {
        httpFactory = new ChannelFactory<IPoS>(
            new BasicHttpBinding(), 
            new EndpointAddress(_address));
        _httpProxy = httpFactory.CreateChannel();
    }
}

ItemDTOクラス:

[DataContract]
public class ItemDTO {
    [DataMember]
    public string ItemID { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Manufacturer { get; set; }
    [DataMember]
    public int StockQuantity { get; set; }
    [DataMember]
    public decimal Price { get; set; }
}
4

1 に答える 1

0

最後に修正しました。解決策は非常に簡単です。

ItemDTODTO クラス (この場合は) の両端に名前空間を与えるだけです。
すなわち:[DataContract][DataContract(Namespace"PoSDTO")]

于 2013-06-14T10:34:05.373 に答える