わかりました、特定の問題を解決するのに非常に苦労しています。サービスを介したオブジェクトの転送。概念的には、それは理にかなっている...と思いますか?私が読んだことから、ジェネリックは明示的に定義されていない限りシリアル化できません。
ですから、私の例を挙げたいと思います。まったく仕事に行けない状況です。つまり、他にも苦労されている方はいらっしゃると思います。コードを提供できるかどうかを支援する場合。それは機能し、それを説明します。そうすれば、問題を完全に理解できます。これは、Windows Communication Foundation を理解するのに役立ちます。
目標は、単純に 5 つのフィールドを持つクライアント アプリケーションです。サーバーに「投稿」します。
- ファーストネーム
- 苗字
- 電子メールアドレス
- 電話番号
- サイトアドレス
それほど複雑ではありません。
これが私が行ったことです。WCF を学ぶために、SOA ベースのアプリケーションにできる限り OOP プリンシパルに近いものを含めました。そのようにして、コードの再利用性を提供します。
モデル/データ契約:
#region Using Reference...
using System.Runtime.Serialization;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;
using System.Linq;
using System;
#endregion
namespace _2Do.Model.Customer
{
[DataContract(IsReference = true)]
public class Person
{
#region Declared Variable.
string first;
string last;
string email;
string phone;
string site;
#endregion
#region Constructor:
Person()
{
// Empty Constructor.
}
#endregion
#region Data Member Properties:
[DataMember()]
public string First
{
get { return first; }
set { first = value; }
}
[DataMember()]
public string Last
{
get { return last; }
set { last = value; }
}
[DataMember()]
public string Email
{
get { return email; }
set { email = value; }
}
[DataMember()]
public string Phone
{
get { return phone; }
set { phone = value; }
}
[DataMember()]
public string Site
{
get { return site; }
set { site = value; }
}
#endregion
}
}
つまり、クライアントのメタデータを介して公開する必要があるオブジェクトです。だから私はこれを試みたサービスインターフェースのために:
#region Using Reference...
using System.Collections.Generic;
using System.Threading.Tasks;
using System.ServiceModel;
using _2Do.Model.Customer;
using System.Text;
using System.Linq;
using System;
#endregion
namespace _2Do.Contract.Customer
{
[ServiceContract (Namespace = "https://_2Do") ]
public interface IPerson
{
[OperationContract()]
Person SetCustomer(Dictionary<Guid, Person> info);
}
}
したがって、上記が目標です。Person オブジェクトを転送します。ディクショナリに格納されます。その他の注意事項; 参照によって値を渡す実装は、シリアル化に役立つと思いました。データがメモリに保存されると、私は考えました。処理するための明示的な方法論が含まれます。それは私の側で間違っていますか?
それが私のDataContract
とServiceContract
です。
この時点での実装は次のようになります。
#region Using Reference...
using System.Collections.Generic;
using System.Threading.Tasks;
using _2Do.Contract.Customer;
using System.ServiceModel;
using _2Do.Model.Customer;
using System.Text;
using System.Linq;
using System;
#endregion
namespace _2Do.Service.Customer
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class PersonService : IPerson
{
#region Constructor:
PersonService()
{
// Empty Constructor.
}
#endregion
#region Implement Interface:
Person SetCustomer(Dictionary<Guid, Person> info)
{
// Receive an error that indicates; best overload method.
// Contains invalid arguments.
}
#endregion
}
}
次に、アプリケーションをホストする別のプロジェクトを作成しました。空のテキスト ファイルを作成し、名前をPersonService.svc
.
次に、次のようにします<%@ ServiceHost Service = "_2Do.Service.Customer.PersonService" %>
。
適切な名前空間を指す必要があります。これPersonService
にはweb.config
、Internet Information System でホストするための最低限の構成を含むファイルがあります。これにより、アドレス、バインディング、および契約の定義を回避できると思いました。IISがすべてをやってくれるので。
ClientProxy
次に、クラスを作成しました。ほとんどのミラーが含まれていますDataContract
。次に、実行する実際のクライアント アプリケーションを作成しました。
PersonProxy p = new PersonProxy();
p.First = txtFirst.Text;
p.Last = txtLast.Text;
p.Email = txtEmail.Text;
p.Phone = txtPhone.Text;
p.Site = txtSite.Text;
Dictionary<Guid, Person> i = new Dictionary<Guid, Person>();
i.Add(Guid.NewGuid(), p);
私はこれらのプロジェクトを持っています:
- モデル --> DataContract
- 契約 --> ServiceContract
- サービス --> インターフェイスの実装
- ホスト --> ストア サービス / サービス
- ClientProxy --> インターフェイスの実装
- クライアント --> ClientProxy が継承する実際の値にリンクされています。
これは、クライアントでそれを消費する方法です。どこでこれを台無しにしたのかわかりません。仕事のプロジェクトで WCF を学ぶ必要があるので、WCF を理解したいと思っています。しかし、この問題を解決できないように見えるので、私はとてもイライラし、とても愚かだと感じています.
チュートリアルに従えばうまくいきます。しかし、元の実装に戻ると失敗します。何がどこで間違っているのかわかりません。手を握っていただければ幸いです。しかし、順を追って説明していただければ幸いです。だから私は自分の過ちから学び、実際に改善することができます。
サーバーに変数を保存して送信することはできません。この時点では理由がわかりません。