在我的C#ClickOnce应用程序中,项目 - > 属性 - > 发布选项卡中有一个自动递增的发布版本.我想在我的菜单帮助 - > 关于框中显示该版本,但我正在使用的代码显然访问了程序集版本,这是不同的.
可以在项目 - > 属性 - > 应用程序 - >装配信息对话框中手动更改装配版本.所以现在,每次我发布之前我都会将发布版本复制到汇编版本,所以我的对话框显示了当前版本的应用程序.必须有更好的方法来做到这一点.
我真正想做的就是拥有一个准确的,自动更新的,代码可访问的版本号.
这是我用来访问程序集版本号的代码:
public string AssemblyVersion
{
get
{
return Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是找到访问发布版本的代码.
我有一个MVC网络应用程序,我正在使用Simple Injector进行DI.我的几乎所有代码都包含在单元测试中.但是,现在我已经在某些控制器中添加了一些遥测调用,我在设置依赖项时遇到了麻烦.
遥测调用用于将指标发送到Microsoft Azure托管的Application Insights服务.该应用程序未在Azure中运行,只是一个带有ISS的服务器.AI门户网站会告诉您有关应用程序的各种信息,包括使用遥测库发送的任何自定义事件.因此,控制器需要一个Microsoft.ApplicationInsights.TelemetryClient实例,该实例没有接口,并且是一个带有2个构造函数的密封类.我试着像这样注册它(混合生活方式与这个问题无关,我只是为了完整而包含它):
// hybrid lifestyle that gives precedence to web api request scope
var requestOrTransientLifestyle = Lifestyle.CreateHybrid(
() => HttpContext.Current != null,
new WebRequestLifestyle(),
Lifestyle.Transient);
container.Register<TelemetryClient>(requestOrTransientLifestyle);
Run Code Online (Sandbox Code Playgroud)
问题是,由于TelemetryClient有2个构造函数,SI抱怨并且验证失败.我找到了一篇文章,展示了如何覆盖容器的构造函数解析行为,但这似乎相当复杂.首先,我想要备份并提出这个问题:
如果我没有使TelemetryClient成为一个注入的依赖项(只是在类中创建一个新的),那么在每次运行单元测试时是否会将遥测发送到Azure,从而产生大量错误数据?或者Application Insights是否足够聪明,知道它在单元测试中运行,而不是发送数据?
对此问题的任何"见解"将不胜感激!
谢谢
c# unit-testing azure simple-injector azure-application-insights
我有一个简单的 Blazor 服务器应用程序,身份使用个人身份验证。我从 VS 2019 标准dotnet new模板创建了该应用程序。
在应用程序的某些部分,我想将用户定向到登录页面,同时传递一个returnUrl参数。我尝试了以下代码变体来传递此参数(counter是我要返回的页面):
NavigationManager.NavigateTo("Identity/Account/Login?returnUrl=counter", forceLoad: true);
Run Code Online (Sandbox Code Playgroud)
NavigationManager.NavigateTo("Identity/Account/Login?returnUrl='/counter'", forceLoad: true);
Run Code Online (Sandbox Code Playgroud)
NavigationManager.NavigateTo("Identity/Account/Login?returnUrl='./counter'", forceLoad: true);
Run Code Online (Sandbox Code Playgroud)
NavigationManager.NavigateTo("Identity/Account/Login?returnUrl='~/counter'", forceLoad: true);
Run Code Online (Sandbox Code Playgroud)
但是,对于所有这些,我收到一条错误消息,指出“URI 不是本地的”。错误信息是:
“InvalidOperationException:提供的 URL 不是本地的。具有绝对路径的 URL 如果没有主机/权限部分,则被认为是本地的。使用虚拟路径 ('~/') 的 URL 也是本地的。”
在这种情况下,有人可以建议正确格式化 returnUrl 参数吗?有关更多背景信息,我正在关注@iambacon(感谢 Colin!)在他关于重定向到 Blazor 应用程序登录页面的博客文章中的建议。这是一篇很棒的文章,完成了我想要的部分内容:当用户未通过身份验证时重定向到登录。我只想添加在身份验证完成后返回该 URL 的额外功能。
我正在寻找一种在C#中读取文档属性的方法.我听说过dsofile.dll,但它似乎是一个旧的COM包装器,并且想知道.NET框架/ C#是否有更现代的东西.我实际阅读的不是Office文档文件,而是具有自定义属性的Solidworks .SLDDRW文件.您可以在Windows资源管理器中通过右键单击该文件来查看和更改这些内容,然后转到"属性"窗口的"自定义"选项卡.
任何人都知道如何在C#/ .NET 3.5中阅读这些自定义属性?
谢谢!
我正在使用自定义策略来保护服务器端 Blazor 应用程序中的页面。一切都运行良好,除了我的策略之一需要了解请求的查询参数。例如,URI 路径类似于https://mywebsite/profile/1234,用于查看/编辑 id=1234 的配置文件。显然我们只希望 profileId = 1234 的用户编辑此页面。我如何在我的 中检查这一点IAuthorizationHandler?
我尝试注入HttpContext并读取 request.Query 项目,但它总是“/”或“/_blazor”,因为它是 SPA 课程。我尝试注入NavigationManager(以前UriHelper)从那里获取 URI,但收到错误:
'RemoteNavigationManager' has not been initialized.
Run Code Online (Sandbox Code Playgroud)
我还尝试使用 Resource 参数将信息传递到我的处理程序中。我找不到任何如何执行此操作的示例,所以这是我的尝试:
这是我的 profile.razor 代码,我使用Policy="CanEditProfile"限制访问
@inject NavigationManager NavigationManager
<AuthorizeView Policy="CanEditProfile">
<NotAuthorized>
<h2 class="mt-5">You are not authorized to view this page</h2>
</NotAuthorized>
<Authorized>
<div class="container my-profile">
<h2>My Profile</h2>
Run Code Online (Sandbox Code Playgroud)
我的IAuthorizationHandler代码:
public Task HandleAsync(AuthorizationHandlerContext context)
{
if (context == null || httpContextAccessor.HttpContext == null) return Task.CompletedTask;
// …Run Code Online (Sandbox Code Playgroud) authorization blazor policy-based-security blazor-server-side
在我的C#app中,我以编程方式安装Oracle客户端(如果不存在),这需要在PATH系统环境变量中添加dir.这一切都可以正常工作,但只有在用户注销到窗口或重新启动后才会生效.如何在没有此步骤的情况下让我的应用识别并使用新的PATH var?即使重新启动我的应用程序也会比要求用户注销/更好.
据推测,将此更改广播到其他进程应该有效.这是我尝试过的,没有成功:
using System.Runtime.InteropServices;
private const int HWND_BROADCAST = 0xffff;
private const int WM_WININICHANGE = 0x001a, WM_SETTINGCHANGE = WM_WININICHANGE, INI_INTL = 1;
[DllImport("user32.dll")]
private static extern int SendMessageTimeoutA(int hWnd, uint wMsg, uint wParam, string lParam, int fuFlags, int uTimeout, int lpdwResult);
int rtnVal = 0;
SendMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, "Environment", 2, 5000, rtnVal);
Run Code Online (Sandbox Code Playgroud)
我被告知如果你停止并重新启动有问题的过程,它应该采取这些类型的更改,但重新启动我的应用程序不会这样做.我想这可能是一个Oracle问题,关于Oracle的一些事情需要登录来识别这个变化,我不确定.提前致谢.
我试图将一些简单的控制台日志记录添加到ASP.NET Core 2.2中的单元测试中,并且由于日志记录配置发生更改而遇到了麻烦。
我目前有以下代码,该代码为我的课程“ DataTests”创建了一个记录器:
// create logger for our unit tests
var serviceProvider = new ServiceCollection()
.AddLogging()
.BuildServiceProvider();
var factory = serviceProvider.GetService<ILoggerFactory>();
var logger = factory.CreateLogger<DataTests>();
Run Code Online (Sandbox Code Playgroud)
但是它不会登录到调试窗口,因此我无法对其进行配置。我想做类似的事情
factory.AddDebug();
Run Code Online (Sandbox Code Playgroud)
但是该扩展名已过时,不再可用。它由ILoggingBuilder上的扩展而不是ILoggerFactory代替。这就是在program.cs中使用的方式
public static void Main(string[] args)
{
var webHost = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json",
optional: true, reloadOnChange: true);
config.AddEnvironmentVariables();
})
.ConfigureLogging((hostingContext, logging) =>
{
// Requires `using Microsoft.Extensions.Logging;`
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
})
.UseStartup<Startup>()
.Build();
webHost.Run();
} …Run Code Online (Sandbox Code Playgroud) 似乎在标准 Blazor 服务器应用程序中,除了开发环境之外,没有正确引用 _content 文件夹项。例如,此引用在任何非开发环境中都失败:
来自_Host.cshtml:
<link href="_content/Blazored.Typeahead/blazored-typeahead.css" rel="stylesheet" />
Run Code Online (Sandbox Code Playgroud)
Repro,以 Blazored-toast 库为例(但任何静态文件引用似乎都有这个问题):
创建一个新的 Blazor 服务器项目 (dotnet new blazorserver)
我缺少什么可以让这个引用在其他环境中工作?
使用最新的默认 Web 应用程序模板,例如dotnet new blazorserver,如果我将环境从本地调试更改为Development本地LocalDevelopment调试,我会丢失所有样式,因为找不到我的 site.css 文件(我们在本地调试时使用此自定义环境,以区分从在我们的共享开发网络服务器上运行。)
我相信这是因为,根据文档,
开发环境中默认启用静态 Web 资源。要在从构建输出运行时支持其他环境中的资产,请
UseStaticWebAssets调用Program.cs.
执行此操作的一种方法是使用 .NET 3.1/5 样式托管模型,如下所示,以启用 UseStaticWebAssets:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStaticWebAssets();
webBuilder.UseStartup<Startup>();
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何使用 .NET 6 风格的托管模型来完成此任务?我们希望为所有新应用程序使用新模型。我尝试过以下方法:
builder.WebHost.UseStaticWebAssets();
Run Code Online (Sandbox Code Playgroud)
这会产生以下异常:
Web 根目录从“C:\Web\BlazorServerApp\wwwroot”更改为“C:\Web\BlazorServerApp\”。不支持使用 WebApplicationBuilder.WebHost 更改主机配置。请改用 WebApplication.CreateBuilder(WebApplicationOptions)。
我试过这个:
builder.Host.ConfigureWebHost(c => c.UseStaticWebAssets());
Run Code Online (Sandbox Code Playgroud)
我什至尝试过这个
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
WebRootPath = "wwwroot"
});
Run Code Online (Sandbox Code Playgroud)
最后一段代码似乎与本意相反;应用程序的根似乎被设置为/而不是预期的wwwroot,因为在浏览器调试窗口中它似乎正在寻找/site.css而不是wwwroot/site.css.
有没有什么方法可以使用新的 .NET 6 托管模型/最小模板来在自定义环境中使用 StaticWebAssets?