銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Visual Studio から AzureやWindows以外のdocker containerで走るASP.NET Core をリモートデバッグする

空いていたので予定を早めて Visual Studio Advent Calendar 12日目のエントリを書きます。

qiita.com

Windows上のdockerやAzure Container ServicesであればVisual Studio Tools for Dockerを使えばVisual StudioからASP.NET Coreのアプリにリモートデバッグできます。Microsoft謹製のサービスしか接続できないので、なにか闇の技術でも使われているかと思われるかもしれないですが、そんなことはなくてGitHubで公開されているMIEngineというデバッグエンジンが利用されています。

github.com

この当たりの話は、Visual StudioからSSHを使えば、Linux上の.NET Coreプロセスにリモートデバッグできるというネタで何度かセッションでデモをしてきました。

というわけで、Visual StudioをインストールしているWindowsマシンからdockerにリモートでコマンドを実行できれば、他のdocker containerであってもリモートデバッグができます。今回は、OpenShift Container Platform上で動くASP.NET Coreアプリにリモート接続してみます。

続きを読む

Linux でも C# 7 を使いたい

C# Advent Calendar 10日目の記事です。

qiita.com

C# 7のリリースが近づいてきている(はず)のですが、専らC# 7の記事はVisual Studioで試しましたというのが多く、.NET Core on Linuxでは試せないのか?という疑問がありました。現時点では、.NET Core 1.0 previewとVisual Studio Code の最新版を使えばC# 7の機能を試すことができます。今回は、.NET Core SDK のDaily Build版とVS Code 1.8.0-insider+C#拡張の最新版1.5.3で試しました。

github.com

marketplace.visualstudio.com

$ dotnet --info
.NET Command Line Tools (1.0.0-preview5-004232)

Product Information:
 Version:            1.0.0-preview5-004232
 Commit SHA-1 hash:  355b6233cb

Runtime Environment:
 OS Name:     rhel
 OS Version:  7.3
 OS Platform: Linux
 RID:         rhel.7.2-x64
 Base Path:   /opt/dotnet/sdk/1.0.0-preview5-004232
続きを読む

Linux の dotnet restore は大文字HTTP_PROXYを認識しない、あるいは curlコマンドは大文字HTTP_PROXYを認識しない件

微妙にハマったので、書いておきます。.NET Core CLI のdotnet restoreコマンドをプロキシ環境下のLinux*1で使う場合、環境変数http_proxyは小文字で設定する必要があります。ちなみにこれはcurlコマンドでも同じです。ちなみにhttps_proxyもしくはHTTPS_PROXYはどちらでも動くのですが、少し挙動が異なるので最後に補足します。

man curl からの抜粋

The environment variables can be specified in lower case or upper case. The lower case version has precedence. http_proxy is an exception as it is only available in lower case.

せっかくなのでコードを追ってみましょう。dotnet restoreはNuGet.Coreを参照してつかっています。環境変数http_proxyのキーはここで定義されています。

NuGet.Client/ConfigurationContants.cs at 3.4.5 · NuGet/NuGet.Client · GitHub

そして、ここで環境変数を取得していますが、この時大文字小文字は区別していません。

NuGet.Client/ProxyCache.cs at 3.4.5 · NuGet/NuGet.Client · GitHub

つまり、大文字でHTTP_PROXYをセットしてもLinux*2では無視されてしまうのです。また、この後のコードを見るとわかるようにURLのチェックをしているので、不正なURLを指定すると警告なしで無視され、プロキシなしでアクセスを試みます。ちなみに認証付きプロキシの場合は、http://user:passowrd@host/http://<username>:<password>@proxy.comの形式で指定すれば動くらしいのですが、手元に認証つきプロキシの環境をすぐに用意できていないので、検証していないです。 また、NuGetのAPIエンドポイントはhttps なのにhttp_proxyなのか?というのもありますが、これもコードを見ると、http_proxyが指定してあればNuGet.Clientがその値を読み取ってそのプロキシサーバーをNuGetの通信ではhttpsでも使うように設定しています。

さて、https_proxy でNuGetのリポジトリを検索してもなにもヒットしません。この環境変数を読み取ることはしていないようです。しかし、https_proxyもしくはHTTPS_PROXYに値をセットするとdotnet restoreのときに使われます。しかもhttp_proxyとは違って不正なURLの場合も使われて、その結果URLにアクセスできない場合はエラーになります。これはなぜ起きるかというと、NuGet.Core がHTTP通信に使っている System.Net.HttpがUnixプラットフォームではcurlライブラリに処理を委譲しているからのようです。

corefx/src/System.Net.Http/src/System/Net/Http/Unix at master · dotnet/corefx · GitHub

さきほどの curl のmanの続きにhttps_proxyもあって、これは大文字小文字を区別しないので、どちらを設定しても使われる挙動になっていました。

なんというかわかりづらい挙動で、はまると抜け出すのが面倒な気がするのでどこかに書いてあると便利な気がするんですが、どこがいいんだろうと悩んでいるところです。

追記: よく見たら、NuGet.configのドキュメントに大文字環境変数で動くと書いていたのでPRを出しました。

*1:確認できないけど多分Macも

*2:正確には環境変数で大文字小文字を区別しないプラットフォーム