私の角クライアントからAspNet Web APIへの要求を圧縮して、帯域幅の使用を最適化しようとしています。これを達成する方法はありますか?Angular to web APIからの圧縮要求
答えて
gzip
などのデータを圧縮するための業界標準のアルゴリズムを使用することも考えられます。それらは生の文字列に対して非常に優れた圧縮を提供し、大きなオブジェクトをサーバーに送信する場合は、要求のサイズを減らしてパフォーマンスを確実に得ることができます。限られた帯域幅を持つモバイルデバイスでアプリを実行すると得られるメリットはもちろんです。
しかし、十分なチャタリング、練習に入ることができます。ここで最大の課題は、javascriptで有効なgzipリクエストを生成することです。 1つの可能性は、この形式の仕様を読み、独自の実装をロールバックするか、既存のライブラリを使用することです。特に興味深いものはpakoです。
これは単に、次のコマンドを発行してbower
を使用して、アプリケーションにインストールするには、些細です:
bower install pako
は、今度は、サンプル要求はクライアントの観点からどのように見えるかを見てみましょう。あなたがサーバーに次のJSONを送信したいと仮定しましょう(どちらかPOSTとして、あるいは動詞をPUT):
{ my: 'super', puper: [456, 567], awesome: 'pako' }
あなたは、単に現代のブラウザで利用可能な無地XMLHttpRequest
オブジェクトを使用して(下記の場合は読むことを達成できます
<script src="bower_components/pako/dist/pako.min.js"></script>
<script>
var xhr = new XMLHttpRequest();
xhr.open('POST', '/api/myresource', true);
// Indicate to the serve that you will be sending data in JSON format
xhr.setRequestHeader('Content-Type', 'application/json');
// Indicate to the server that your data is encoded using the gzip format
xhr.setRequestHeader('Content-Encoding', 'gzip');
xhr.onreadystatechange = function (e) {
if (this.readyState == 4 && this.status == 200) {
alert('We have just successfully sent a gzip encoded payload to the server');
}
};
var data = { my: 'super', puper: [456, 567], awesome: 'pako' };
var binaryString = pako.gzip(JSON.stringify(data));
xhr.send(binaryString);
</script>
、あなたが角度の要求について尋ねているので、のは、ネイティブ$http
オブジェクトを使用して、このサンプルのAJAX要求をAngularifyてみましょう:あなたは)角度特定のソリューションに興味がある
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
</head>
<body ng-app="myapp">
<div ng-controller="HomeController"></div>
<script src="bower_components/pako/dist/pako.min.js"></script>
<script src="bower_components/angular/angular.min.js"></script>
<script>
angular.module('myapp', []).controller('HomeController', ['$http', function ($http) {
var data = { my: 'super', puper: [456, 567], awesome: 'pako' };
var binaryString = pako.gzip(JSON.stringify(data));
var req = {
method: 'POST',
url: '/api/myresource',
headers: {
'Content-Type': 'application/json',
'Content-Encoding': 'gzip'
},
data: binaryString,
transformRequest: []
}
$http(req).then(function (result) {
alert('We have just successfully sent a gzip encoded payload to the server');
}, function() {
alert('OOPS, something went wrong, checkout the Network tab in your browser for more details');
});
}]);
</script>
</body>
</html>
OK、基本的には、AJAXリクエストを使用するクライアントサイド送信部分をカバーし、適切なContent-Encodingリクエストヘッダーを指定しました。
ここでは、サーバー側の部分について説明します。 IISでホストされているWeb API 2を使用しているとしましょう。
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = GlobalConfiguration.Configuration;
config.MapHttpAttributeRoutes();
app.UseWebApi(config);
config.EnsureInitialized();
}
}
、その後明らかにあなたがあなたのペイロードをマッピングするためのビューモデルがあります:
public class MyViewModel
{
public string My { get; set; }
public int[] Puper { get; set; }
public string Awesome { get; set; }
}
を
だから、基本的に、あなたのWeb APIをブートストラップしますASP.NETアプリケーションでStartup
クラスを持っているでしょう
とあなたのAJAX要求のサーバー側のハンドラの目的を果たすだろうウェブAPIコントローラ:
public class TestController : ApiController
{
[HttpPost]
[Route("api/myresource")]
public HttpResponseMessage Post(MyViewModel viewModel)
{
// We will simply echo out the received request object to the response
var response = Request.CreateResponse(HttpStatusCode.OK, viewModel);
return response;
}
}
これまでのところとても良いです。残念ながら、Web APIはgzip
要求エンコーディングをそのまま受け付けていません。しかし、これはかなり拡張可能なフレームワークなので、クライアントからのリクエストを解凍する方法を知るカスタム委譲ハンドラを記述するだけです。
public class DecompressedHttpContent: HttpContent
{
private readonly HttpContent _content;
public DecompressedHttpContent(HttpContent content)
{
_content = content;
foreach (var header in _content.Headers)
{
Headers.TryAddWithoutValidation(header.Key, header.Value);
}
}
protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
using (var originalStream = await _content.ReadAsStreamAsync())
using (var gzipStream = new GZipStream(originalStream, CompressionMode.Decompress))
{
await gzipStream.CopyToAsync(stream);
}
}
protected override bool TryComputeLength(out long length)
{
length = -1;
return false;
}
}
、その後、私たちの委譲ハンドラ:
のは、カスタムHttpContentを書くことから始めましょう
public class GzipDecompressionHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken
)
{
var isCompressedPayload = request.Content.Headers.ContentEncoding.Any(x => string.Equals(x, "gzip", StringComparison.InvariantCultureIgnoreCase));
if (!isCompressedPayload)
{
return await base.SendAsync(request, cancellationToken);
}
request.Content = new DecompressedHttpContent(request.Content);
return await base.SendAsync(request, cancellationToken);
}
}
すべてのことは、私たちのStartup
クラスでこのカスタムハンドラを登録するには、今されて残っています:
config.MessageHandlers.Add(new GzipDecompressionHandler());
それはかなりです。クライアント側のAJAXリクエストからTestController.Postアクションが呼び出されると、入力ボディに適切なヘッダーが含まれ、委任ハンドラがデコード処理を行い、Postアクションが呼び出されたときに期待されるビューモデルが既にデシリアライズされるようにします。
ここで要約されているような小さな要求に対しては、gzipを使用してもほとんど得られないことに注意してください。追加する魔法のgzip番号のために悪化さえする可能性もありますペイロード。しかし、より大きなリクエストに対しては、このアプローチは確実にリクエストサイズを減らし、gzipの使用を強くお勧めします。
- 1. Web Api gzip圧縮
- 2. asp.net webservice handling gzip圧縮要求
- 3. Asp.net 4.0 Webサービスの圧縮
- 4. WCF .NETからのHTTP要求をトランスポートレベルで圧縮する方法は?
- 5. AWS Cloudfrontから圧縮Angular 2バンドルを提供する方法
- 6. XHR要求でGzip圧縮が機能しない
- 7. Angular2/Angularシードhttpプロキシミドルウェアプロキシapi要求
- 8. guzz 6の要求の本体を圧縮する方法(gzip)
- 9. nginxを使用した要求の圧縮
- 10. ストリームから直接圧縮
- 11. ASP.NETのWeb APIとのHTTP圧縮を有効に
- 12. JSON APIのAmazon EC2インスタンスで圧縮/圧縮解除が機能しない
- 13. 圧縮されたAPIレスポンス
- 14. AWS APIゲートウェイ圧縮レスポンス
- 15. InstagramからのAPI要求
- 16. Angular Route GuardからのWeb Apiコール
- 17. C#をストリームから圧縮して圧縮する
- 18. .Net Web API 2 POSTで消費されるgzip圧縮コンテンツ
- 19. .NETアプリケーションからWeb APIへの投稿要求を送信
- 20. デコード圧縮応答(libcurlの)私が使用してWebサーバーから圧縮された応答を求めている
- 21. 要求のWeb APIの確認
- 22. 圧縮するか圧縮しないか?
- 23. ベアラトークン(Web API)からID要求を取得
- 24. データ圧縮と画像圧縮の差
- 25. LZ4:圧縮画像フォーマットの圧縮
- 26. コントロール圧縮APPX
- 27. Angular 4 Web Application to Ionic 3 App
- 28. 圧縮ヘッダーを設定し、圧縮してヘッダーを圧縮しますか?
- 29. ウェブページの圧縮
- 30. Angular Post json to .netコアweb apiはnullです(更新済み)
この完全に有効な質問が閉じられるように投票した理由私は疑問に思う:
そして、ここでは、この努力の結果です。 –
@DarinDimitrovおそらく広すぎる。いいえ、MCVEは別の可能性です。また、それは考慮されることができます(http://stackoverflow.com/questions/32246690/angularjs-compress-http-post-data) – DavidG
私は質問が広すぎるとは思わない。まったく逆です。これはまさにポイントです.JavaScriptクライアントから送信されるHTTPリクエストを最適化する方法を探しています。 MCVEに関する限り、この特定のケースでは、設計の種類の問題であるため、提供されるコードや例はありません。一方、私はそれが欺瞞かもしれないことに同意します。 –