小编Ran*_*age的帖子

如何在.NET ClickOnce应用程序中将发布版本与程序集版本同步?

在我的C#ClickOnce应用程序中,项目 - > 属性 - > 发布选项卡中有一个自动递增的发布版本.我想在我的菜单帮助 - > 关于框中显示该版本,但我正在使用的代码显然访问了程序集版本,这是不同的.

可以在项目 - > 属性 - > 应用程序 - >装配信息对话框中手动更改装配版本.所以现在,每次我发布之前我都会将发布版本复制到汇编版本,所以我的对话框显示了当前版本的应用程序.必须有更好的方法来做到这一点.

我真正想做的就是拥有一个准确的,自动更新的,代码可访问的版本号.

这是我用来访问程序集版本号的代码:

public string AssemblyVersion
{
    get
    {
        return Assembly.GetExecutingAssembly().GetName().Version.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是找到访问发布版本的代码.

c# build-automation clickonce version

34
推荐指数
3
解决办法
2万
查看次数

将Application Insights与单元测试结合使用?

我有一个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

16
推荐指数
5
解决办法
6455
查看次数

如何将 returnUrl 传递到 Blazor Server 应用程序中的登录页面?

我有一个简单的 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# identity server blazor

10
推荐指数
1
解决办法
6655
查看次数

如何在c#中读取自定义文件属性

我正在寻找一种在C#中读取文档属性的方法.我听说过dsofile.dll,但它似乎是一个旧的COM包装器,并且想知道.NET框架/ C#是否有更现代的东西.我实际阅读的不是Office文档文件,而是具有自定义属性的Solidworks .SLDDRW文件.您可以在Windows资源管理器中通过右键单击该文件来查看和更改这些内容,然后转到"属性"窗口的"自定义"选项卡.

任何人都知道如何在C#/ .NET 3.5中阅读这些自定义属性?

谢谢!

c# properties file

7
推荐指数
2
解决办法
1万
查看次数

如何在 Blazor AuthorizationHandler 中获取 URI

我正在使用自定义策略来保护服务器端 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

6
推荐指数
1
解决办法
1471
查看次数

C#/.NET应用程序无法识别环境变化(PATH)

在我的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的一些事情需要登录来识别这个变化,我不确定.提前致谢.

c# variables environment path

5
推荐指数
1
解决办法
2778
查看次数

如何将调试日志记录添加到C#.NET Core单元测试中?

我试图将一些简单的控制台日志记录添加到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)

c# logging unit-testing .net-core

5
推荐指数
3
解决办法
399
查看次数

Blazor 服务器 - 静态文件不会在非 DEV 环境中链接

似乎在标准 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)

  1. 添加所有必要的 Blazored / Toast 元素,包括演示 Toast 消息的代码
  2. 测试 toast 是否正常工作将 launchSettings.json ASPNETCORE_ENVIRONMENT 更改为 Staging、Production 或 Development 以外的任何内容
  3. 再次运行程序(使用ISS Express本地调试),发现css格式不正确
  4. 更改调试设置以使用 Kestrel(将 IIS Express 下拉菜单更改为 BlazorApp1 或类似的)
  5. 请注意 kestrel,css 工作正常

我缺少什么可以让这个引用在其他环境中工作?

blazor blazor-server-side blazored

4
推荐指数
1
解决办法
1506
查看次数

在具有自定义环境的 .NET 6 Web 应用程序中找不到 site.css

使用最新的默认 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?

.net css web .net-6.0

4
推荐指数
1
解决办法
1799
查看次数