c#

ASP.NET Core で GraphQL API

c#

GraphQL API が必要になったので、ASP.NET Core で実装できるか試してみた。ライブラリは現状 GraphQL 一択。 www.nuget.org GraphiQL っていう、GraphQL を試すのに便利な Web UI があるので、それも利用した。ASP.NET Core のミドルウェアを使えば組み込む…

ASP.NET Core のキャッチオールルートパラメーターでハマった

c#

例えば、はてなブログのカスタム URL みたいな、entry/ 以下にすべてマッチするルートを定義する場合、ASP.NET Core MVC だと下記のように書く。 [HttpGet("entry/{*path}")] public async Task<IActionResult> Details(string path) { // IIS Express は %2F を / に戻して</iactionresult>…

IdentityServer4 の認証を差し替える方法

c#

はじめに 外部に公開する REST API の認証・認可に OpenID Connect を選択した場合、ASP.NET Core での実装には IdentityServer4 を使うことになると思う。IdentityServer4 は認証のバックエンドに ASP.NET Core Identity をサポートしているので、新規の開…

ASP.NET Core MVC vs. WCF

c#

はじめに 以前 WCF と gRPC のベンチマークを比較して、結果 gRPC の圧勝だった。 tnakamura.hatenablog.com ASP.NET Core MVC(Web API) と WCF ではどっちが速いか気になったので試してみた。WCF のサービスは今のところ .NET Framework で動かすしかないの…

.NET で Firestore

Firebase を使ってアプリをサクッと作れるようになりたかったので勉強することにした。まずは Firestore。アプリは Xamarin で作るつもりなので、C# から Firestore を触ってみる。NuGet で専用のパッケージが公開されているので、それを使う。まだベータ版…

Swashbuckle.AspNetCore で Failed to load API definition に遭遇したら

c#

開発中の Web API に後から Swashbuckle.AspNetCore を追加したはいいけど、いざ Swagger UI を表示してみたら「Failed to load API definition」というエラーになって API 一覧が見れない。こんな感じのやつ。 このエラーに遭遇したら、ググる前にまず swag…

Amazon Product Advertising API を使って Amazon の商品情報を取得する

c#

プログラムで Amazon の商品を検索したり、ASIN で商品情報を引っ張ってきたりしたくなったので、Amazon Product Advertising API を触ってみた。この API を呼び出すには、あらかじめ Amazon アソシエイトにログインして認証キーを取得しておく必要がある。…

Web スクレイピングではてなブロググループのブログ一覧を取得する

c#

はてなブロググループに登録しているブログの一覧を、 Web スクレイピングで取得するサンプルを書いてみた。 HTML のパースには AngleSharp を使用。 using AngleSharp.Dom.Html; using AngleSharp.Parser.Html; using System; using System.Linq; using Sys…

はてなブログの RSS フィードをダウンロードしてパースする

c#

はてなブログの RSS フィードをダウンロードしてパースするサンプルを書いてみた。 RSS フィードのダウンロードは HttpClient.GetStringAsync で一発。 RSS フィードは所詮 XML なので、パースは LINQ to XML でこれまた一発。 簡単過ぎてわざわざブログに書…

JwtBearer Authentication と ASP.NET Core Identity の 2 要素認証を無理やり組み合わせてみた

c#

以前、JwtBearer Authentication の裏で ASP.NET Core Identity を使うことには成功した。 tnakamura.hatenablog.com ASP.NET Core Identity は 2 要素認証をサポートしているので、 JwtBearer Authentication を使う場合でもなんとか組み合わせることができ…

gRPC vs. WCF

c#

はじめに 仕事で開発に携わっているアプリでは通信に WCF を使っている。 一方で去年から Microservices やゲームのバックエンドとして gRPC が盛り上がっている。 gRPC は通信に HTTP/2 を使っていて、HTTP/2 はクライアントとサーバー間の通信がバイナリベ…

Entity Framework Core で値オブジェクトを実装する

c#

Entity Framework Core 2.0 の頃から既に値オブジェクトを実装する資料は存在した。 docs.microsoft.com ただ、自分がやりたかったのは「エンティティの ID を値オブジェクトにすること」だったので、 ちょっと違う。 Entity Framework Core 2.1 から追加さ…

JwtBearer Authentication の裏で ASP.NET Core Identity を使う

c#

認証に ASP.NET Core Identity を使うけど、アプリ向けに JwtBearer の認証もサポートしたい。JwtBearer でトークンを発行するときは、ユーザーを認証するコードを書くことになるわけなので、そこで Identity の SignInManager や UserManager を使えばいい…

PostgreSQL で character(n) 型の列を主キーにしていたら Entity Framework Core で酷い目にあった

PostgreSQL で Entity Framework Core(Npgsql.EntityFrameworkCore.PostgreSQL) を使っていて、 テーブルの主キーの列に character(n) 型を使っていたら、 エンティティの更新に失敗して嵌った。 再現サンプルは下記の通り。 using Microsoft.EntityFramewor…

AssemblyBuilder を使った動的クラス生成

c#

先日、Expression と DynamicMethod でそれぞれ動的にデリゲートを生成するサンプルを書いてみた。 tnakamura.hatenablog.com メタプログラミングの目的がリフレクションの高速化なら、 動的なデリゲート生成で事足りる場合が多い。 今回は一歩進んで、動的…

PostgreSQL で Entity Framework Core を使っていて money 型でハマった

PostgreSQL で Entity Framework Core を使っていて、PostgreSQL の money 型の列を C# の decimal 型のプロパティにマップしたら、プロパティに格納される値がなんか変でハマった。テーブルに格納されている値の 100 分の 1 になってる。 試したのは下記の…

メタプログラミング事始め

c#

はじめに 『メタプログラミング.NET』を読んで、 C# で黒魔術もといメタプログラミングを習得したくなってしまったので、 まずは簡単なお題で練習してみた。 メタプログラミング.NET (アスキー書籍)作者: KevinHazzard,JasonBock出版社…

ASP.NET Core はインテグレーションテストが書きやすい

c#

ASP.NET Core はインテグレーションテストをちゃんとサポートしているので、Web API のテストが書きやすい。 www.nuget.org このパッケージを使えば、xUnit を使ったテストプロジェクトで Web API を簡単にホストしてテストできる。自分の場合、インテグレー…

Xamarin.iOS で EntityFrameworkCore のマイグレーションを使う

はじめに 先日、Xamarin.iOS で EntityFrameworkCore が使えることがわかった。 tnakamura.hatenablog.com そうなると、データベースのマイグレーションがやりたくなるのは自然な流れ。 今度はマイグレーションを試してみた。 マイグレーションファイルを生…

Xamarin.iOS で EntityFrameworkCore を使う

Xamarin.iOS で EntityFrameworkCore を使うことができたのでメモしておく。 データベースは SQLite。 なのでパッケージは Microsoft.EntityFrameworkCore.Sqlite をインストールすることになる。 www.nuget.org Visual Studio で NuGet パッケージをインス…

Azure SQL Database の一時テーブルに SqlBulkCopy が使えるようになっていた

Azure SQL Database は着実に改善しているようで、以前はできなかった「SqlBulkCopy を使った一時テーブルへの書き込み」ができるようになっていた。 検証に使ったソースコードを貼っておく。 using System; using System.Configuration; using System.Data.…

Entity Framework Plus を使ってタイプセーフに一括更新を行う

c#

Entity Framework Core を使っていて、 エンティティをまとめて更新したい場面は結構あるが、 タイプセーフかつ効率的に更新する手段は、 今のところ標準で提供されていない。 ExecuteSqlCommand を使って直接 SQL を発行すればいいんだけど、 テストではInM…

EntityFrameworkCore で SQL Server の IDENTITY プロパティを使うときの注意点

EntityFrameworkCoreのバージョンは v2.0.1。 例えば次のようなテーブルがあるとする。 create table Entry ( Id bigint identity(1,1) not null, Title nvarchar(100) not null, Body nvarchar(max) null, constraint pk_Entry primary key clustered ( Id …

Azure Functions を使った Azure Storage の増分バックアップ

先日作成した Azure Storage のコンテナをバックアップするプログラムは、高速化しても完了までに 5 時間弱かかる。 tnakamura.hatenablog.com こいつを毎日実行するのは気が引ける。コンテナの完全バックアップは週一回にしておき、増分バックアップを毎日…

WCF on .NET Core

c#

.NET Core でも WCF を使うことはできる。提供されているのはクライアントライブラリだけなので、.NET Core で動く WCF サービスを作ることはできないけど。 試しに TCP でやってみた。WCF サービスは .NET Framework で作るしかない。 using System; using …

Azure Storage に保存したブロブのバックアップを高速化

先日、「Azure Storageに保存したブロブをバックアップ専用ストレージアカウントにコピーする」プログラムを書いたが、素直に実装したため激しく遅かった。並列化すらしていないから当然か。 tnakamura.hatenablog.com そこで、『Azure Storage Data Movemen…

Azure Storage に保存したブロブのバックアップ

仮想マシンのイメージなんかを Azure Storage にバックアップする記事は探せばすぐ見つかるけど、 Azure Storage に保存しているブロブを別のどこかにバックアップする記事は見つけることができなかったので、 Microsoft.WindowsAzure.Storage を使ってバッ…

Azure Storage を使っていて同時接続数でハマった

Azure Storage に添付ファイルをアップロードする処理を持つ ASP.NET Core MVC(.NET Core) アプリを、 Azure App Service にデプロイしてベンチマークをとってみたら、 スケールアウトやスケールアップしても思ったようにパフォーマンスが上がらなくて、 ボ…

.NET Core 時代のコマンドライン引数解析

c#

.NET でコンソールアプリケーションを開発するときの悩みの種が、コマンドライン引数の解析。 .NET Framework がコマンドラインパーサーを提供してくれないので、 仕方なくオレオレパーサーを書いたり、Mono にあるライブラリを使ったりしてきたけど、 .NET …

JwtBearerAuthentication を使っている Web API を Swashbuckle.AspNetCore で試す

c#

Swashbuckle.AspNetCore を使うことで、 ASP.NET Core で作成した Web API を Swagger UI 上で試せるようになった。 ただ、大抵の Web API では OAuth2 なり JWT Bearer なりの認証が必要、という風に実装していると思う。 自分の場合は JWT Bearer。 Swagge…