pmilet.Playback
1.2.2
dotnet add package pmilet.Playback --version 1.2.2
NuGet\Install-Package pmilet.Playback -Version 1.2.2
<PackageReference Include="pmilet.Playback" Version="1.2.2" />
paket add pmilet.Playback --version 1.2.2
#r "nuget: pmilet.Playback, 1.2.2"
// Install pmilet.Playback as a Cake Addin #addin nuget:?package=pmilet.Playback&version=1.2.2 // Install pmilet.Playback as a Cake Tool #tool nuget:?package=pmilet.Playback&version=1.2.2
Asp.Net Core Playback
An Asp.Net Core middleware library for recording and replay http requests (inbound and outbound).
Purpose
Record your Web api incoming (your API received calls) and outgoing (calls from your API to external dependencies) http requests for later replay in a dev / testing environment. Useful for unit testing, and or regresion testing your API.
How to Setup
In your Startup class:
using pmilet.Playback;
...
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
...
public IServiceProvider ConfigureServices(IServiceCollection services)
{
...
services.AddPlayback(Configuration);
...
//don't forget to return the service provider
return services.BuildServiceProvider();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UsePlayback();
...
}
...
In your appsetings.json file:
Add playback storage section that points to the storage (blob, or file) where the requests and responses will be saved:
Sample configuration for using a blob storage:
{
"PlaybackStorage": {
"ConnectionString": "UseDevelopmentStorage=true",
"ContainerName": "playback"
},
Sample configuration for using local file system:
"PlaybackStorage": {
"ConnectionString": "Local",
"ContainerName": "PlaybackFiles"
},
In your controllers:
if using swagger, decorate your controller for swagger to generate playback headers in swagger UI
using pmilet.Playback;
...
[HttpGet]
[SwaggerOperationFilter(typeof(PlaybackSwaggerFilter))]
public async Task<string> Get()
...
How to record and replay incoming Api requests?
Once your Asp.NetCore Api is configured for playback ( see above section or refer to sample in github repo ) you can start recording your api requests by setting the client request X-Playback-Mode header value to Record.
curl -X GET --header 'Accept: text/plain' --header 'X-Playback-Mode: Record' 'http://apigatewaysample.azurewebsites.net/api/Hello/hello'
then a x-playback-id response header will be returned.
Response Headers
{
"date": "Wed, 25 Oct 2017 21:05:46 GMT",
"content-encoding": "gzip",
"server": "Kestrel",
"x-powered-by": "ASP.NET",
"vary": "Accept-Encoding",
"content-type": "text/plain; charset=utf-8",
"transfer-encoding": "chunked",
"x-playback-id": "_ApiGateway+Sample_v1.0_Hello%252Fhello_GET_757602046"
}
To replay a previously recorded request, set the client request X-Playback-Mode header to Playback and the X-Playback-Id header with the playbackid value received from the recording response.
curl -X GET --header 'Accept: text/plain' --header 'X-Playback-Id: _ApiGateway+Sample_v1.0_Hello%252Fhello_GET_757602046' --header 'X-Playback-Mode: Playback' 'http://apigatewaysample.azurewebsites.net/api/Hello/bye'
When setting the x-playback-mode to None the playback functionality is bypassed.
PlaybackId format
The returned playbackid header is composed of differents parts each one carrying important context information. Each playbackid part is separated by an underscore :
PlaybackContextInfo_ApiName_PlaybackVersion_RequestPath_RequestMethod_RequestContextHash
- The PlayContextInfo comes from the X-Playback-RequestContext header.
- The ApiName is the web api Name.
- The PlaybackVersion comes from the X-Playback-Version header.
- The RequestPath is the request path url encoded
- The RequestMethod is the request http verb
- The RequestContextHash is a hash of the request payload in order to univoquely indentify each different request.
For example this playbackid DemoUser_ApiGateway+Sample_v1.0_Hello%252Fhello_GET_757602046 can be descompsed as:
- PlayContextInfo = DemoUser
- AssemblyName = ApiGateway+Sample
- PlaybackVersion = v1.0
- RequestPath = Hello%252Fhello
- RequestMethod = GET
- RequestContextHash = 757602046
How to record responses received from outbound requests
For replaying responses from outgoing requests you should use the HttpClientFactory. this code excerpt show how you:
imagine you have a service proxy to call to an external http service (postman-echo) :
public class MyServiceProxy : IServiceProxy
{
public HttpClient HttpClient { get; protected set; }
public MyServiceProxy(HttpClient httpClient)
{
HttpClient = httpClient;
}
public async Task<MyServiceResponse> Execute( MyServiceRequest command)
{
var requestUri = $"https://postman-echo.com/get?foo1={command.Input}&foo2={command.Input}";
var r = await HttpClient.GetAsync(requestUri);
var content = await r.Content.ReadAsStringAsync();
return new MyServiceResponse() { Output = content };
}
}
''
by overriding this proxy, you can inject a playback specific handler that will be able to record and replay outgoing calls by refering to the playback context and playbackstorage service
```cs
public class MyPlaybackProxy : MyServiceProxy, IServiceProxy
{
private const string PROXY_NAME = "MyServiceProxy";
readonly IPlaybackContext _playbackContext;
readonly IPlaybackStorageService _playbackStorageService;
private readonly IHttpClientPlaybackErrorSimulationService _configService;
public MyPlaybackProxy(IPlaybackContext playbackContext, IPlaybackStorageService playbackStorageService, IHttpClientPlaybackErrorSimulationService configService) :
base(new System.Net.Http.HttpClient())
{
_playbackContext = playbackContext;
_playbackStorageService = playbackStorageService;
_configService = configService;
base.HttpClient = HttpClientFactory.WithPlaybackContext(playbackContext, playbackStorageService, PROXY_NAME, configService);
}
}
''
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 is compatible. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
- Microsoft.AspNetCore (>= 1.1.3)
- Microsoft.AspNetCore.WebUtilities (>= 1.1.2)
- Newtonsoft.Json (>= 10.0.3)
- Swashbuckle.AspNetCore.Swagger (>= 1.1.0)
- Swashbuckle.AspNetCore.SwaggerGen (>= 1.1.0)
- WindowsAzure.Storage (>= 8.7.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.2.2 | 1,655 | 4/1/2019 |
1.2.1 | 1,223 | 2/19/2018 |
1.2.0 | 1,065 | 2/19/2018 |
1.1.2 | 1,156 | 1/23/2018 |
1.1.1 | 1,228 | 1/23/2018 |
1.1.0 | 1,081 | 1/23/2018 |
1.0.10 | 2,034 | 10/27/2017 |
1.0.9 | 1,497 | 10/25/2017 |
1.0.8 | 1,152 | 10/25/2017 |
1.0.7 | 1,305 | 10/22/2017 |
1.0.6 | 1,082 | 10/21/2017 |
1.0.5 | 999 | 10/21/2017 |
1.0.4 | 1,019 | 10/21/2017 |
1.0.3 | 997 | 10/18/2017 |
1.0.2 | 995 | 10/18/2017 |
1.0.1 | 994 | 10/18/2017 |
1.0.0 | 869 | 10/15/2017 |
new way to fake outbound responses by using a playback HttpClient