2

次のシナリオがあります。

  • ボックス X のプログラム P (完了するまでに最大 30 分かかる場合があります)。
  • ボックス Y の WinForms アプリケーション - P の入力基準を収集します。
  • P は非常に時間がかかるため、常に Y ではなくボックス X で実行する必要があります。

X で WCF サービス アプリケーションを使用するようにアドバイスされました。サービス コントラクトを介して Y から X にメッセージを送信すると、プログラム P が起動されます。

これは WCF Service App プロジェクトの有効な使用法ですか?


私は次の 2 つのウォークスルーに従いました。

  1. WCF サービスを作成する
  2. WCF サービスを使用するコンソール アプリを作成する

私は今、お互いに話しているように見える 2 つのプロジェクトを持っています。コンソール アプリから次のコードを実行できますmoveData。WCF プロジェクトにあるメソッドは、パラメーターに基づく情報でデータベースを正常に更新します。

        static void Main(string[] args) {
                Service1Client sc = new Service1Client();
                sc.moveData(0,1);
                sc.Close();
        }

私はこの種の技術に非常に慣れていません - 注意してください。次の質問:
WCF プロジェクトを開いているか、Visual Studio で実行している場合にのみ機能します - これは予想どおりですか? つまり、WCF が実行されていない場合、消費するアプリはエラーをスローする必要がありますか?
つまり、WCF プロジェクトで Vis Studio のインスタンスを閉じてから、消費するアプリケーションを実行しようとすると、エラーが表示System.ServiceModel.EndpointNotFoundException was unhandled There was no endpoint listening at...followed by address of service されます。ボックス X にこの WCF を利用させるにはどうすればよいですか? そのボックスに何をインストールまたは展開する必要がありますか?

コンシューマー コンソール アプリの app.config は次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://....svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>
4

3 に答える 3

1

他の提案によると、Windows サービスは簡単に構築およびセットアップできます。サーバー(BOX X)の起動時に自動起動するように設定することもできます

MSDN の記事コード プロジェクトのチュートリアルを参照してください。

基本的に:

public class UserService1 : System.ServiceProcess.ServiceBase  
{

    public UserService1() 
    {
        this.ServiceName = "MyService2";
        this.CanStop = true;
        this.CanPauseAndContinue = true;
        this.AutoLog = true;
    }
    public static void Main()
    {
        System.ServiceProcess.ServiceBase.Run(new UserService1());
    }
    protected override void OnStart(string[] args)
    {
        // Insert code here to define processing.
    }
    protected override void OnStop()
    { 
        // Whatever is required to stop processing
    }
}

編集

次に、処理するデータをデータベース、ファイル システム、またはその他の場所に保持し、クライアント (コンソール アプリ) が使用できる WCF サービスを介してデータを公開できます。

于 2012-10-01T21:27:52.287 に答える
1

WCF を使用してこれを作成する方法のサンプルと、SRC コードへのリンクについては、このコードを参照してください。

<system.serviceModel>
 <services>
   <service behaviorConfiguration="returnFaults" name="TestService.Service">
      <endpoint binding="wsHttpBinding" bindingConfiguration=
            "TransportSecurity" contract="TestService.IService"/>
      <endpoint address="mex" binding="mexHttpsBinding" 
            name="MetadataBinding" contract="IMetadataExchange"/>
  </service>
 </services>
 <behaviors>
   <serviceBehaviors>
    <behavior name="returnFaults">
     <serviceDebug includeExceptionDetailInFaults="true"/>
       <serviceMetadata httpsGetEnabled="true"/>
       <serviceTimeouts/>
   </behavior>
  </serviceBehaviors>
 </behaviors>
 <bindings>
    <wsHttpBinding>
       <binding name="TransportSecurity">
             <security mode="Transport">
              <transport clientCredentialType="None"/>
              </security>
        </binding>
      </wsHttpBinding>
 </bindings>
 <diagnostics>
  <messageLogging logEntireMessage="true" 
    maxMessagesToLog="300" logMessagesAtServiceLevel="true" 
    logMalformedMessages="true" logMessagesAtTransportLevel="true"/>
  </diagnostics>
 </system.serviceModel>

//Contract Description
[ServiceContract]
interface IService
{
  [OperationContract]
   string TestCall();
}

//Implementation
public class Service:IService
{
  public string TestCall()
  {
      return "You just called a WCF webservice On SSL
                    (Transport Layer Security)";
  }
}

//Tracing and message logging
<system.diagnostics>
  <sources>
      <source name="System.ServiceModel" 
    switchValue="Information,ActivityTracing" propagateActivity="true">
         <listeners>
           <add name="xml"/>
        </listeners>
      </source>
        <source name="System.ServiceModel.MessageLogging">
        <listeners>
            <add name="xml"/>
         </listeners>
         </source>
    </sources>
        <sharedListeners>
          <add initializeData="C:\Service.svclog" 
        type="System.Diagnostics.XmlWriterTraceListener" name="xml"/>
         </sharedListeners>
       <trace autoflush="true"/>
</system.diagnostics>

このサンプル用にダウンロードできるソース コードをダウンロードして、自分で試してみてください。同じ手順に従って、サービスを同様に機能させます

于 2012-10-01T21:28:43.550 に答える
0

メッセージを処理するためのデータベースを監視する Windows サービスをおそらく作成します。その後、サービスはサーバー上で常に実行されている可能性があります (これはボックス X であると想定しています)。WCF サービスは長時間実行されるプロセスを開始できますが、おそらくそれをホストするべきではありません。もちろん、Asp.Net がホストする WCF サービスを想定しています。WCF をホストする Windows サービスも構築できます。これにより、サービスがメッセージ データベースを監視する必要がなくなります。

于 2012-10-01T21:07:54.393 に答える