2017-03-28 8 views
0

私は、ASP.NET WebプロジェクトでQuartz.NETを使用してスケジューラを実装しています。このWebサイトには、WPFデスクトップアプリケーションのバックエンドを構成するWCFサービスが格納されています。したがって、Webサイトは、デスクトップアプリケーションのユーザーがアクティブな場合にのみアクティブになります。これは、夜間にWebサイトアプリケーションが終了する可能性が高いことを意味します。しかし、私はスケジューラを常に稼働させておきたい。WebサイトのルートURLをQuartz.NETジョブから取得するにはどうすればよいですか?

Windowsサービスを使用することは、私たちのホスティングのためにオプションではないことに注意してください。私はQuartz.NETのようなものに悩まされています(私が知る限り)。

20分のタイムアウトを避けるために、私は19分ごとにサイトのページを呼び出すスケジュールされたジョブを使用するための多くの提案を見てきました。最初の質問は、これを行う最良の方法ですか?

もしそうなら、私はもう2番目の質問があります。私が見たすべての例では、ハードコーディングされたURLが表示されています。これは避けたいものです。理想的には、コード内でURLを取得したいので、Visual Studioで実行すると、URLがlocalhostというURLに転送され、デプロイされるとライブのURLが取得されます。

私はweb.configファイルにURLを入れて、展開時にこれをライブのものに変更するためにトランスフォームを使用することができますが、もっと良い方法があるかどうかは疑問でした。

答えて

0

この男はよくそれを考えているようだ:

https://www.mikesdotnetting.com/article/254/scheduled-tasks-in-asp-net-with-quartz-net

を私が死ん上記のリンクの場合には、ここでヘッダー段落を貼り付けます。その後、将来の読者は、検索するための具体的な情報があります。

A perennial question on the ASP.NET forums concerns how to schedule regular tasks as part of a web application. Typically, the requirement is to send emails once every 24 hours at a particular time each day, but it could actually be anything from tweeting on a schedule to performing maintenance tasks. Equally typically, half a dozen members on the forum dive in with recommendations to install Windows Services or schedule batch files with the Task Scheduler - regardless of the fact that most web site owners are not afforded such privileges as part of their shared hosting plan. 

上記のURLは、以下のとおりです。

あなたはWindowsサービスを書くことができないので、このURLを見てください。いくつかの選択肢があります。

https://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

+0

返信いただきありがとうございますが、私の質問にどのように答えるか分かりません。最初のリンクは、私がQuartz.NETを使い始めたときに使った主なものでしたが、すばらしい紹介ですが、私の質問はカバーしていません。 2番目のリンクに関しては、(彼がいつものように)良い読書ですが、私の質問には答えません。スケジュールされたジョブを設定するためのさまざまなオプションが用意されていますが、すでにQuartz.NETにコミットしているので、今は切り替えたくありません。スケジューラを保持しているWebサイトのルートURLを見つけるのと同じ質問がまだ残っているので、切り替えは役に立ちません。どういう意味? –

0

答えは非常に簡単であることを私に起こりました。ジョブそのものはウェブのコンテキストについては何も知らないが、それを含むアプリケーションは何もしない。私が行うために必要なすべてがウェブサイトにpingを実行ジョブに静的な文字列プロパティを追加しました

...

public static string WebSiteRootUrl = ""; 

...その後、ASP.NETのWebのGlobal.asax.csでプロジェクトには、アプリケーションの起動時にRequestオブジェクトが使用できないので、私は、次の...

protected void Application_BeginRequest(object sender, EventArgs e) { 
     if (KeepWebSiteAliveJob.WebSiteRootUrl == "") { 
     string uri = HttpContext.Current.Request.Url.AbsoluteUri; 
     KeepWebSiteAliveJob.WebSiteRootUrl = uri.Substring(0, uri.IndexOf("/", 8) + 1); 
     } 
    } 

をした、私はa)は、それが毎回要求を解雇されることを意味し、Application_BeginRequestでこれをしなければなりませんでしたが作成され、b)HttpContext.Current.Request.Url.AbsoluteUriによって返されたURLには、要求されたリソースだけでなく、目的のルートURL。

最初の問題を回避するために、私はKeepWebSiteAliveJob.WebSiteRootUrlがまだ設定されていない(つまり空の文字列である)場合にのみ設定します。これは最初の要求になります。私はこれが実際にチェックなしの問題ではないと思います。問題は起こりそうもなく速いので、簡単なチェックでした。

第2の問題点として、URLにスキームとドメインの間に2つのスラッシュが含まれ、ドメインと(オプションの)ポートの後ろに3つのスラッシュが含まれるという事実を利用しました。スキームにhttpまたはhttpsだけを使用しているので、マジックナンバー8は二重スラッシュの後でIndexOf()検索を開始します。つまり、ルートURLを取得します。

これは誰かを助けることを望みます。

関連する問題