我的应用程序是ASP.NET Core 1.0 Web API。
我想使用controllers
测试我的TestServer
。
我有controller
类,其中包含Authorize
属性。
如果Iam测试控制器而没有使用Authorize
属性进行修饰,那么eveything可以正常工作。因此,TestServer
设置正确无误。
我执行以下操作来设置AuthenticationHeader
:
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", this.RequestToken(client).Result);
并从我的TestServer
private async Task<string> RequestToken(HttpClient client)
{
var requestTokenUri = "secret";
var tokenModel = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("tokendata", "secret"),
new KeyValuePair<string, string>("tokendata", "secret"),
new KeyValuePair<string, string>("tokendata", "secret"),
new KeyValuePair<string, string>("tokendata", "secret")
};
var tokenPostData = new FormUrlEncodedContent(tokenModel);
var tokenRequestResult = await client.PostAsync(requestTokenUri, tokenPostData);
tokenRequestResult.EnsureSuccessStatusCode();
var body = JObject.Parse(tokenRequestResult.Content.ReadAsStringAsync().Result);
var token = (string)body["access_token"];
return token;
}
这也有效。如果我打印RequestToken(HttpClient)
的结果,则会为我提供有效的Bearer token
,并且通话tokenRequestResult.EnsureSuccessStatusCode();
也会有效。
现在,如果我用Authorize
装饰我的控制器并尝试像这样测试我的控制器(剪断)它会失败:
[TestMethod]
public async Task ShouldDoSomething()
{
// Arrange
var data = JsonConvert.SerializeObject("Just some data");
// Test
var response = await this.client.PostAsync(this.requestUri, jsonContent);
// Assert
response.EnsureSuccessStatusCode();
}
请记住:如果控制器未使用Authorize
属性进行修饰,则此方法有效。
但是,如果Iam使用Bearer-token
和AuthenticationHeadervalue
执行此操作,Iam会在调用await this.client.PostAsync(this.requestUri, jsonContent);
时收到以下错误:
Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求启动HTTP / 1.1 GET http://
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:错误:处理消息时发生异常。System.InvalidOperationException:IDX10803:无法从“http://localhost:5000/.well-known/openid-configuration”获取配置。 ---&GT; System.IO.IOException:IDX10804:无法从“http://localhost:5000/.well-known/openid-configuration”检索文档。 ---&GT; System.Net.Http.HttpRequestException:发送请求时发生错误。 ---&GT; System.Net.Http.WinHttpException:Die Serververbindung konnte nicht hergestellt werden 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Net.Http.WinHttpHandler.d__105.MoveNext() ---内部异常堆栈跟踪结束---
在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.Net.Http.HttpClient.d__58.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束---
在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.d__8.MoveNext() ---内部异常堆栈跟踪结束---
at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.d__8.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束---
在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.d__3.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束---
在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在Microsoft.IdentityModel.Protocols.ConfigurationManager`1.d__24.MoveNext() ---内部异常堆栈跟踪结束---
at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.d__24.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束---
在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.d__1.MoveNext() Ausnahmeausgelöst:System.Private.CoreLib.ni.dll中的“System.InvalidOperationException” Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求已完成2204.6107ms 200
我尝试将BackchannelHttpHandler
从JWTBearerOptions
设置为TestServer
的{{1}}。但这是不可能的,因为我需要一个WebHostBuilder
对象来创建我的TestServer
:
protected HttpClient GetClient(IWebHostBuilder builder)
{
if (builder == null)
{
builder = new WebHostBuilder().UseContentRoot(GetDirPath())
.UseStartup<Startup>()
.UseEnvironment("Development")
.ConfigureServices(services =>
{
services.AddTransient<IAuthRepo, TestAuthRepo>();
services.AddTransient<IOtherRepo, TestOtherRepo>();
});
}
var server = new TestServer(builder);
...
现在我应该如何在创建BackChannelHandler
的过程中设置TestServer
,而不需要TestServer
?
任何人都可以帮助我吗?
谢谢