私はMVC WebサイトをAzureにデプロイしています。そこでは、ユーザーがhtmlページからpdfファイルを生成できるようにする必要があります。私はコントローラアクションから呼び出されたWebJob内でwkhtmltopdf.exeを呼び出すことでこれを行います。レンダリングされるHTMLページは、ActionResultを返す別のコントローラアクションによって生成されます。webjobから呼び出されるコントローラアクションを保護する
[AllowAnonymous]を使ってアクション(私はpdfのhtmlをレンダリングする)を装飾するとすべてうまく動作しますが、何とかそれを保護したいと思います。
Webジョブからの要求を認証することも、mysecureactionにWebジョブからの要求にのみデータを返すこともできますか?ここで
は、私のWebの仕事のコードです:
static void Main(string[] args)
{
if (args.Length == 2)
{
var URL = args[0];
var filename = args[1];
try
{
using (var p = new System.Diagnostics.Process())
{
var startInfo = new System.Diagnostics.ProcessStartInfo
{
FileName = "wkhtmltopdf.exe",
Arguments = URL + " " + filename,
UseShellExecute = false,
};
p.StartInfo = startInfo;
p.Start();
p.WaitForExit();
p.Close();
}
// here save the pdf file to azure blob storage
}
catch (Exception ex) { /*error handling*/ }
}
}
そしてここでは、Webの仕事を呼び出すコードです:
string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority +
Request.ApplicationPath.TrimEnd('/');
string Url = baseUrl + "/mycontroller/mysecureaction/" + id.ToString();
string filename = "filename.pdf";
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://myazurewebapp.scm.azurewebsites.net/");
client.DefaultRequestHeaders.Accept.Clear();
var userName = "$myazurewebappuser";
var password = "myazurewebapppassword";
var encoding = new ASCIIEncoding();
var authHeader = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
encoding.GetBytes(string.Format($"{userName}:{password}"))));
client.DefaultRequestHeaders.Authorization = authHeader;
var content = new System.Net.Http.StringContent("");
HttpResponseMessage response =
await client.PostAsync($"api/triggeredwebjobs/myWebJob/run?arguments={Url} {filename}", content);
if (!response.IsSuccessStatusCode)
{
//error handling
}
}
}
catch (Exception ex)
{
//error handling
}
byte[] file = null;
try
{
using (var client = new WebClient())
{
// retrieve the file from blob storage
file = client.DownloadData("https://myazureaccount.blob.core.windows.net/pdf/" + filename);
}
}
catch (Exception ex) { /*error handling*/ }
// return the file to the user
そして、明らかにここにウェブの仕事は、HTML
を取得するために呼び出すアクションだが[AllowAnonymous]
public ActionResult mysecureaction(int? id)
{
SomeData model = new SomeData();
// get some data from db using id
return View(model);
}
ありがとう、これは素晴らしいコメントです。私がWebJobを使用する理由は、Azureで直接使用することのできないpdf変換実行ファイルでした。私はどのようにキューを実装するかを調べ始めるでしょう、誰かが私を特定の方向に向けることができれば感謝します。 – crazysnake
@crazysnake WebアプリケーションとWebJobは同じサンドボックス内で実行されるため、WebJobで何かが可能な場合、Webアプリケーションでも機能します。サポートされているPDFツールとサポートされていないPDFツールのリストについては、[here](https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#unsupported-frameworks)を参照してください。 –
甘い! Davidに感謝します!私がAzureサンドボックス内で外部実行ファイルを実行することは不可能であったが、私自身のラッパークラスライブラリを作成することは、そのトリックを完璧にやったという印象を受ける前に発見した資料によると、また、問題なくAllowAnonymous属性を使用できます。 – crazysnake