5

極端な初心者からこの質問を許してください。私は他のどこにも答えを見つけることができませんでした。

EntityFrameworkとWCFを使用してソリューションを作成しています。私はいくつかの異なるクライアントを作成します。データベース接続文字列を、EntityFrameworkプロジェクトのapp.configファイルとWCFホストのapp.configファイルの両方に配置しました。

ホストクラスでは、GetAllCustomers()と呼ばれる、データベースから(EFから)すべての顧客を取得する1つのメソッドを使用して、単純なテストサービスコントラクトを作成しました。次に、ホストのGetAllCustomers()を呼び出して、すべての顧客の名前と名前をコンソールに書き込む単純なコンソールクライアントアプリを作成しました。

クライアントを実行しようとすると、「アプリケーション構成ファイルに「TRS11Entities」という名前の接続文字列が見つかりませんでした」というエラーが表示されました。

接続文字列をクライアントコンソールアプリのapp.configファイルにコピーすると正常に機能しますが、コメントアウトすると再び機能しなくなります。

WCFホストはクライアントではなくデータベースと直接通信しているため、クライアントが接続文字列を必要とする理由がわかりません。接続文字列が、クライアントからWCFホスト、EntityFrameworkへのチェーンを介して渡されていると推測できます。WCFホストに.NETに「お金はここで止まります!app.configの接続文字列を使用して、この情報についてクライアントに迷惑をかけないようにしてください!」と伝えるにはどうすればよいですか。

重要な場合は、Visual Studio Pro 2012を使用しており、すべてのプロジェクトはC#で記述されており、V4.5.NETフレームワークを対象としています。

WCFサービスプロジェクトのAPP.CONFIGから:

  <system.serviceModel>
    <services>
      <service name="OrsonServiceLibrary.Service1">
        <endpoint address="localhost" binding="basicHttpBinding" name="TRS11Entities"
          contract="OrsonServiceLibrary.IService1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/OrsonServiceLibrary/Service1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <connectionStrings>
    <add name="TRS11Entities" connectionString="metadata=res://*/TRS11Model.csdl|res://*/TRS11Model.ssdl|res://*/TRS11Model.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='character set=NONE;data source=localhost;initial catalog=&quot;C:\Program Files (x86)\TRS11\Data\DATA1100.FDB&quot;;user id=sysdba;password=masterkey'" providerName="System.Data.EntityClient" />
  </connectionStrings>

Entity FrameworkプロジェクトのAPP.CONFIGから:

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="TRS11Entities" connectionString="metadata=res://*/TRS11Model.csdl|res://*/TRS11Model.ssdl|res://*/TRS11Model.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='initial catalog=&quot;C:\Program Files (x86)\TRS11\Data\DATA1100.FDB&quot;;user id=sysdba;password=masterkey;data source=localhost'" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>

コンソールクライアントアプリのAPP.CONFIGから:

  <system.serviceModel>
    <client>
      <endpoint address="http://localhost:8000/Service1" contract="OrsonServiceLibrary.IService1" binding="basicHttpBinding" />
    </client>
  </system.serviceModel>

  <!--<connectionStrings>
    <add name="TRS11Entities" connectionString="metadata=res://*/TRS11Model.csdl|res://*/TRS11Model.ssdl|res://*/TRS11Model.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='character set=NONE;data source=localhost;initial catalog=&quot;C:\Program Files (x86)\TRS11\Data\DATA1100.FDB&quot;;user id=sysdba;password=masterkey'" providerName="System.Data.EntityClient" />
  </connectionStrings>-->

WCFサービスプロジェクトのGetAllCustomers()関数のコード:

public HashSet<CUSTOMER> GetAllCustomers()
{
    var db = new TRS11Entities();

    HashSet<CUSTOMER> TheCusts = new HashSet<CUSTOMER>();

    foreach (CUSTOMER c in db.CUSTOMERs)
    {
        TheCusts.Add(c);
    }

    return TheCusts;
}

コンソールクライアントアプリコード:

static void Main(string[] args)
{
    Console.WriteLine("Press Enter to begin.");
    Console.ReadLine();

    Service1 MyService = new Service1();

    HashSet<CUSTOMER> cl = MyService.GetAllCustomers();

    foreach (CUSTOMER c in cl)
    {
        Console.WriteLine(c.CUSTFNAME + " " + c.CUSTLNAME);
    }

    Console.WriteLine("Press Enter to exit.");
    Console.ReadLine();
}

ホストアプリケーションコード:

class Program
{
    static void Main(string[] args)
    {
        ServiceHost hostA = null;

        try
        {
            hostA = new ServiceHost(typeof(Service1));
            hostA.Open();

            Console.WriteLine();
            Console.WriteLine("Host started.  Press Enter to terminate host.");
            Console.ReadLine();

        }
        finally
        {
            if (hostA.State == CommunicationState.Faulted)
                hostA.Abort();
            else
                hostA.Close();
        }
    }
}

ありがとう、ジョー

4

3 に答える 3

2

プロキシ/チャネルを使用する代わりに、クライアントアプリでサービスのインスタンスを実際に作成しているとのことです。

クライアントアプリコードのService1タイプは何ですか?OrsonServiceLibrary.Service1ですか?

Service1 MyService = new Service1();

その場合は、サービスプロジェクトへの参照を削除し、代わりにサービス参照を追加してください。これにより、サービスへのアクセスに使用できるプロキシが生成されます。

于 2012-12-29T05:18:50.383 に答える
1

クライアントアプリは、接続をwcfサービスに渡していません。私の推測では、クライアントアプリでデータベースに意図しない呼び出しを行っていると思います。これで、エラーと、コンソールアプリに接続文字列を追加したときにエラーが発生する理由が説明されます。

お役に立てば幸いです。いくつかのコードを投稿してください。そうすれば、さらに支援できる可能性があります。

于 2012-12-28T13:02:50.660 に答える
0

コードがないと、質問への回答がはるかに難しくなりますが、ライブラリアプリの構成ファイルに接続文字列が含まれていることが問題であると思われます。ここでの違いは、プログラムを実行すると、実行中のアセンブリアプリ構成ファイルから設定が読み込まれることです。

設定が「MyApp.exe.config」ファイルにあることを確認してください

于 2012-12-28T13:28:53.190 に答える