我正在使用带有Asp.Net Identity 2的Web Api 2.1.我试图在我的ApiController的构造函数上获取经过身份验证的用户(我使用AutoFac来注入我的依赖项),但是在调用构造函数时,User显示为未经过身份验证.
我试图获取用户,以便我可以为任何数据库写操作生成审计信息.
我正在做的一些事情可以帮助诊断:
我只 app.UseOAuthBearerTokens使用Asp.Net Identity 2进行身份验证.这意味着app.UseCookieAuthentication(new CookieAuthenticationOptions())当您使用Asp创建新的Web Api 2.1项目时,我删除了默认启用的功能. .Net Identity 2.
在里面WebApiConfig我正在注入我的存储库:
builder.RegisterType<ValueRepository>().As<IValueRepository>().InstancePerRequest();
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
[RoutePrefix("api/values")]
public class ValuesController : ApiController
{
private IValueRepository valueRepository;
public ValuesController(IValueRepository repo)
{
valueRepository = repo;
// I would need the User information here to pass it to my repository
// something like this:
valueRepository.SetUser(User);
}
protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
// User is not avaliable here either...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我检查构造函数上的User对象,这就是我得到的: …
我无法理解为什么SQL输出具有我在LINQ中编写的简单查询的子查询.这是我的代码:
var list = db.User.Where(u => u.Name == somename).OrderBy(u => u.IdUser).ToList();
Run Code Online (Sandbox Code Playgroud)
其中somename是我传递在执行时的参数.
输出SQL是:
SELECT
Project1.IdUser,
Project1.Name
FROM (SELECT
Extent1.IdUser,
Extent1.Name
FROM user AS Extent1
WHERE Extent1.Name = 'John' /* @p__linq__0 */) AS Project1
ORDER BY
Project1.IdUser ASC
Run Code Online (Sandbox Code Playgroud)
输出真的应该有一个简单的子查询吗?
我也试过了
var list = db.User.Where(u => u.Name.Equals(somename)).OrderBy(u => u.IdUser).ToList();
Run Code Online (Sandbox Code Playgroud)
它产生与上面相同的输出.
如果我对参数进行硬编码,例如:
var list = db.User.Where(u => u.Name == "John").OrderBy(u => u.IdUser).ToList();
Run Code Online (Sandbox Code Playgroud)
它按预期工作,仅生成
SELECT
Extent1.IdUser,
Extent1.Name
FROM user AS Extent1
WHERE 'John' /* @gp1 */ = Extent1.Name
ORDER BY
Extent1.IdUser ASC …Run Code Online (Sandbox Code Playgroud) 我正在使用Xamarin(Android)构建应用程序,它使用PCL项目作为服务层.我有一个Web Api端点,我正在使用HttpClient它.
一切正常,但是如果我让我的Android应用程序打开并闲置一段时间(比如2分钟)并且我尝试发出新请求,那么使用单例的第一个请求HttpClient将无效.它永远不会返回并保持在那里直到超时(TaskCancelledException).我也在我的Api上设置了一个断点,它没有被击中.如果我再次尝试发送请求,那么它可以工作.
经过大量的调试后,我发现只有当我尝试使用HttpClient单例作为单例时才会发生这种情况.如果我HttpClient为每个请求创建一个新的一切都有效.
起初我认为这是一个僵局问题,我做了很多研究,并按照其他答案和Stephen Cleary的优秀帖子所描述的指导原则进行了双重检查,我几乎可以肯定事实并非如此.
我正在使用ConfigureAwait(false)来自我的PCL项目的每次调用,因此它不会捕获上下文.
在Android片段内:
SampleService svc = new SampleService();
response = await svc.GetAllSamples();
Run Code Online (Sandbox Code Playgroud)
这个服务叫(在我的PCL项目中):
public class SampleService
{
public HttpClient Client { get; set; }
public SampleService()
{
// resolves my singleton instance and uses my custom DelegatingHandler
Client = CustomHttpClient.Instance;
}
public async Task<IEnumerable<Sample>> GetAllSamples()
{
IEnumerable<Sample> list = null;
// this never returns and timeouts the first …Run Code Online (Sandbox Code Playgroud) 能够在集成测试中自定义主机配置有助于避免调用在测试期间根本不应运行的服务。使用标准Startup模型可以轻松实现这一点,CreateHostBuilder覆盖WebApplicationFactory. 我使用“最小 API”方法尝试了很多事情,但无法弄清楚。
使用该模型的完整示例Startup如下:
程序.cs:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
// This is a service that downloads Configuration from the internet, to be used
// as a source for `IConfiguration`, just like any `appsettings.json`.
// I don't want this running during testing
.AddConfigServer();
}
Run Code Online (Sandbox Code Playgroud)
正如您可以想象的那样,AddConfigServer调用外部 Web 服务器来下载我想要在应用程序启动中使用的配置,但我绝对不希望我的集成测试调用此外部 Web 服务器,原因如下:不想依赖外部服务,不想用测试请求来打击我的配置服务器,不想让我的服务器自定义暴露给我的测试,等等。
使用该Startup …
c# ×4
.net ×1
asp.net-core ×1
async-await ×1
katana ×1
minimal-apis ×1
owin ×1
sql ×1
sql-server ×1