2012-05-06 23 views
16

IIS/WCF実装の多くの問題をゼロからテストするために、HelloWorldサービスとクライアントを作成しました(非常にきれいに)here。 net.tcpのエンドポイントを追加しました。サービスは、両方のバインディングに対して、IIS 7.5(Windows 7の場合)という独自のという名前で、エンドツーエンドで正しく動作しています。IIS 7.5/WCFサービスではAutoStart/Pre-warm機能が動作しません

私が取り組んでいるのは、発表されているAutoStartとPreload(または "pre-warm caching")の機能です。私はherehere(互いに非常に似ていますが、常に第二の意見を持つのが良い)指示された指示に非常に密接に従ってきました。どのI

手段1)アプリケーションプールstartModeを設定...

<applicationPools> 
    <!-- ... --> 
    <add name="HW" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" /> 
</applicationPools> 

2)...)serviceAutoStartを有効にして、私のserviceAutoStartProvider

<site name="HW" id="2"> 
    <application path="/" applicationPool="HW" serviceAutoStartEnabled="true" serviceAutoStartProvider="PreWarmMyCache" /> 
    <!-- ... --> 
</site> 

3へのポインタを設定し...そのプロバイダの名前をつけて、クラスのGetType().AssemblyQualifiedNameがその全体の下に記載されている

<serviceAutoStartProviders> 
    <add name="PreWarmMyCache" type="MyWCFServices.Preloader, HelloWorldServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
</serviceAutoStartProviders> 

using System; 

namespace MyWCFServices 
{ 
    public class Preloader : System.Web.Hosting.IProcessHostPreloadClient 
    { 
     public void Preload(string[] parameters) 
     { 
      System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\temp\PreloadTest.txt"); 
      sw.WriteLine("Preload executed {0:G}", DateTime.Now); 
      sw.Close(); 
     } 
    } 
} 

ああ、すべてこのマニュアルの構成に加え、夫婦iisreset呼び出し、と私は何を取得。いいえw3wp.exeタスクマネージャでプロセスが起動します(HelloWorldClientを起動しても取得できます)。テキストファイルはありません。

この機能については、SOまたはより広範なWebで不満足なほどの議論がありますが、ここではあまり注意を払わない類似の質問もいくつかあり、すべて警告音が鳴ります。おそらく、不必要なことにもかかわらず - この非常に道のりを一歩下にたどりついた専門家がいるか、時間をかけて2つのケアをするのか? (。あなたはそれをホストするのに適した場所を提案することができれば、ソリューション全体を提供するハッピー)


EDIT:私は相対App_DataフォルダにPreload方法でそのパスをリセットしてみました(他はSO提案答えますそれは問題ではありませんでした。また、私はw3wp.exeプロセス火災をローカルホストへの簡単なブラウズで学びました。このプロセスでは、1つの小さなOperationContractを処理するために17MBのメモリが消費されますが、価格はゼロのPreload値を提供します。 17MBのColdDeadCache

+0

ありありイベントログに手がかりがありますか?スローされた例外はそこに表示されるはずです。 – Addys

+0

いいえ、何もありません。サービスがうまく動作すれば、例外が予想される理由は分かりません。 – downwitch

+0

確認できることはいくつかあります: - あなたのサイトのIDは2ですか? - サイトとアプリケーションプールの名前が同じであることが正しいですか? - 例より多くの属性を指定しましたが、例のものを指定するだけで違いがありますか? –

答えて

4

これはあなたの問題のために、わずかに異なるアプローチである:

  1. 使用Windows Server AppFabricサービスカスタムスタートアップコード1再

実行する

  • 使用WCFインフラストラクチャを自動起動するために:Appfabric AutoStart featureがすべきをあなたがサービスを登録するためにMVCのServiceRouteを使用していない場合は、Web.configのserviceActivationsセクションで指定するか、物理的にセクションを指定する必要があります0ファイル。

    再2:あなたはこのように属性を使用することができWCFパイプラインにカスタムスタートアップコードを挿入するには:

    using System; 
    using System.ServiceModel; 
    using System.ServiceModel.Description; 
    
    namespace WCF.Extensions 
    { 
        /// <summary> 
        /// Allows to specify a static activation method to be called one the ServiceHost for this service has been opened. 
        /// </summary> 
        [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] 
        public class ServiceActivatorAttribute : Attribute, IServiceBehavior 
        { 
         /// <summary> 
         /// Initializes a new instance of the ServiceActivatorAttribute class. 
         /// </summary> 
         public ServiceActivatorAttribute(Type activatorType, string methodToCall) 
         { 
          if (activatorType == null) throw new ArgumentNullException("activatorType"); 
          if (String.IsNullOrEmpty(methodToCall)) throw new ArgumentNullException("methodToCall"); 
    
          ActivatorType = activatorType; 
          MethodToCall = methodToCall; 
         } 
    
         /// <summary> 
         /// The class containing the activation method. 
         /// </summary> 
         public Type ActivatorType { get; private set; } 
    
         /// <summary> 
         /// The name of the activation method. Must be 'public static void' and with no parameters. 
         /// </summary> 
         public string MethodToCall { get; private set; } 
    
    
         private System.Reflection.MethodInfo activationMethod; 
    
         #region IServiceBehavior 
         void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
         { 
         } 
    
         void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
         { 
          serviceHostBase.Opened += (sender, e) => 
           { 
            this.activationMethod.Invoke(null, null); 
           }; 
         } 
    
         void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
         { 
          // Validation: can get method 
          var method = ActivatorType.GetMethod(name: MethodToCall, 
              bindingAttr: System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public, 
              callConvention: System.Reflection.CallingConventions.Standard, 
              types: Type.EmptyTypes, 
              binder: null, 
              modifiers: null); 
          if (method == null) 
           throw new ServiceActivationException("The specified activation method does not exist or does not have a valid signature (must be public static)."); 
    
          this.activationMethod = method; 
         } 
         #endregion 
        } 
    } 
    

    このように使用することができます..which:

    public static class ServiceActivation 
    { 
        public static void OnServiceActivated() 
        { 
         // Your startup code here 
        } 
    } 
    
    [ServiceActivator(typeof(ServiceActivation), "OnServiceActivated")] 
    public class YourService : IYourServiceContract 
    { 
    
    } 
    

    正確だこと私たちはかなり長い間、そして多数のサービスで使用してきました。 WCF ServiceBehaviorを(IISインフラストラクチャに依存するのではなく)カスタムスタートアップコードに使用することの特別な利点は、任意のホスティング環境(セルフホスト含む)で動作し、より簡単にテストできることです。

  • +0

    おかしい、私たちは既にAppFabricの方向を向いています。だからこれはいいダブテールです。あなたのコードを、テストされていなくても大好きで、行きたいところを見ることができます。バウンティのあなたが、あなたは、私がコメント欄でより多くの質問がある場合に追いつくために持っている;)私はちょうどあなたの2つの点が依存していることを明確にしたかった – downwitch

    +0

    @ServiceGuy、(IeはAppFabricのを使用**と** WCFインフラストラクチャにフックを追加) 。言い換えると、ポイント2は、AutoStart IISホスティングコンテキストの問題を解決しません。あれは正しいですか? – pamphlet

    +0

    @pamphlet:はい、1と2は、(1)実際にあなたのサービスを自動的に開始するように、必要であろう(2)カスタムのOnStartロジックを実行します。 – mthierba

    1

    私は同じことをしました。それは動作します...

    プリロードメソッドで私は利用可能な白い白紙からコピーされたいくつかのコードを持っていますhere

    プリロード方法は、私は、これは不条理な音を知っているが、私は同じ問題(w3wp.exeの設定変更を行った後、自動的に発射されていない)に直面し、私がいなかったので、それがあった

    public void Preload(string[] parameters) 
    {  
         bool isServceActivated = false; 
         int attempts = 0; 
         while (!isServceActivated && (attempts <10)) 
         { 
          Thread.Sleep(1 * 1000); 
          try 
          { 
           string virtualPath = "/Test1/Service1.svc"; 
           ServiceHostingEnvironment.EnsureServiceAvailable(virtualPath); 
           isServceActivated = true; 
          } 
          catch (Exception exception) 
          { 
           attempts++; 
           //continue on these exceptions, otherwise fail fast 
           if (exception is EndpointNotFoundException || 
            exception is ServiceActivationException || 
            exception is ArgumentException) 
           { 
            //log 
           } 
           else 
           { 
            throw; 
           } 
          } 
         } 
        } 
    
    3

    ...のように見えますapplicationHost.configファイルを編集しているときに管理モードでテキストエディタを実行します。私の愚かな間違い。

    私の防衛では、メモ帳++を使っていましたが、実際にはそうではないときに節約していると私に言っていました。

    +2

    おそらくあなたは64ビットシステムになっていますか?保存がこの非常に同じことにhttp://stackoverflow.com/a/17595896/90033 – Konstantin

    +1

    OMG、私はちょうど半分の私の一日失った:-) 32ビットフォルダにリダイレクトされます知られている「機能」があります。あなたのためのupvote! :-) –

    +1

    @コンスタンチン.......実際には正解でなければなりません。これはとてもそうです。先端のおかげで、私の日を救った。 –

    1

    多分あなたは64ビットシステムになっていますか?保存が32ビットのフォルダにリダイレクトされますので、変更が

    を拾っませんWindowsで知ら"feature"は(答えが見つけやすいかもしれないと私は答えに私のcommentを変換しました)

    関連する問題