0

「サーバー」と「クライアント」の 2 つの WinForms アプリケーションがあります。サーバー上

private ServiceHost host;
private const string serviceEnd = "Done";

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    List<string> sqlList = new List<string>();
    foreach (string line in this.richTextBoxSql.Lines)
        sqlList.Add(line);
    SqlInfo sqlInfo = new SqlInfo(sqlList);

    host = new ServiceHost(
        typeof(SqlInfo),
        new Uri[] { new Uri("net.pipe://localhost") });

    host.AddServiceEndpoint(typeof(ISqlListing),
            new NetNamedPipeBinding(),
            serviceEnd);

    host.Open();
}

どこ

public class SqlInfo : ISqlListing
{
    public SqlInfo() {}

    private List<string> sqlList;
    public SqlInfo(List<string> sqlList) : this() 
    {
        this.sqlList = sqlList;
    }

    public List<string> PullSql()
    {
        return sqlList;
    }
}

[ServiceContract]
public interface ISqlListing
{
    [OperationContract]
    List<string> PullSql();
}

私が持っているクライアントで

private ISqlListing pipeProxy { get; set; }
private const string serviceEnd = "Done";

public Form1()
{
    InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
    List<string> l = pipeProxy.PullSql();
    string s = String.Empty;
    foreach (string str in l)
        s += str + " ";
    this.richTextBoxSql.AppendText(s.ToString());
}

private void Form1_Load(object sender, EventArgs e)
{
    ChannelFactory<ISqlListing> pipeFactory =
    new ChannelFactory<ISqlListing>(
      new NetNamedPipeBinding(),
      new EndpointAddress(
         String.Format("net.pipe://localhost/{0}", serviceEnd)));

    pipeProxy = pipeFactory.CreateChannel();
}

List<string>問題は、それを使用してサーバーからを「プル」すると、デフォルトのコンストラクターpipeProxy.PullSql()が呼び出され、 .public SqlInfo() {}sqlList = null

RichTextBoxこのコードを取得して、サーバー アプリのテキストを返すにはどうすればよいですか?

4

1 に答える 1

2

これは、次の種類のサービスホストを使用しているためです。

 host = new ServiceHost(
        typeof(SqlInfo),
        new Uri[] { new Uri("net.pipe://localhost") });

SqlInfo型を渡すと、WCFフレームワークは、要求を処理するために型のインスタンスを作成する必要があると推測します。構築されたインスタンスへの参照を渡すようにしてください。SqlInfoつまりsqlInfo、あなたの場合です。 ServiceHostのこのオーバーロードを使用すると、インスタンスを直接渡すことができます。

host = new ServiceHost(
            sqlInfo,
            new Uri[] { new Uri("net.pipe://localhost") });
于 2012-12-07T17:33:43.343 に答える