小编pix*_*xel的帖子

将非托管本机库文件包含到 nuget 输出目录中

未管理的共享对象(.so 文件)不会复制到输出目录:

我有一个 .netstandard 2 项目,它包装了一个 C++ 库(让我们称这个项目为 wrap.csproj)。该项目依赖于共享对象 (libgdal.so)。

我想将此项目用作 nuget,因此,将引用我的 nuget 的项目应该在 build/publish 文件夹中包含 wrap.dll 和 libgdal.so。

我将此项目打包为 nuget。但是引用此 nuget 的项目(dotnet 核心)没有得到 libgdal.so 文件,只是 build/published 文件夹中的 wrap.dll,因此我收到运行时错误。

我将此属性添加到 nuget csproj:

<ItemGroup>
<None Include="libgdal.so">
<Pack>true</Pack>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

编辑:从@zivkan 的帮助中稍微看一下后,我成功了

我需要做的就是添加这样的包路径:

<ItemGroup>
    <None Include="libgdal.so">
        <Pack>true</Pack>
        <PackagePath>runtimes/linux-x64/native</packagePath>
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

c# nuget nuget-package .net-core

3
推荐指数
1
解决办法
534
查看次数

使用polly c#在http请求超时时重试多次

我的初衷是在请求本身超时时重试多次,例如尝试与另一个关闭几秒钟的微服务通信时,希望它是暂时的失败。如果有一个更简单的解决方案来做到这一点就足够了。我决定使用包装策略手动设置每次重试的超时时间,希望达到相同的结果。

我在这里看到了一个类似的解决方案,没有使用 httpclientfactory Use a specific timeout connected to a retrypolicy,但它对我不起作用。

我的代码如下所示:

services.AddHttpClient("retryclient", client =>
{
    client.Timeout = TimeSpan.FromSeconds(100);
}).AddPolicyHandler((servs, request) =>
    Policy.HandleResult<HttpResponseMessage>(r =>
        {
            return r.StatusCode == HttpStatusCode.NotFound; //(1)
        }).
.OrTransiesntHttpError().
WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(retryAttempt),
    onRetry: (exception, timespan, retryAttempt, context) =>
        { // using servs to log // });
}).WrapAsync(Policy.TimeoutAsync(1)));
Run Code Online (Sandbox Code Playgroud)

当我尝试访问“未找到”地址而不包装超时策略时,我已经检查过重试策略是否有效,并且它工作正常。我还尝试将第 (1) 行与状态代码一起使用,HttpStatusCode.RequestTimeout而不是在我的案例中找不到,但它不起作用。

当我使用包装并尝试访问已关闭的服务时,它会Polly.Timeout.TimeoutRejectedException在第一次尝试时按我的预期抛出 a ,但不会再次重试。我无法找到重试多次的方法,要么为每次重试设置超时,要么仅在请求本身超时时不使用超时策略。

编辑:进一步阅读 https://cm.engineering/transient-timeouts-and-the-retry-rabbit-hole-net-4-5-f406cebbf194 后,似乎我的问题出在我无法访问的策略处理中HttpClient 的取消令牌。我假设我可以通过覆盖 sendAsync 方法来修复它,如链接所示。在创建工厂时是否有一种优雅的方式来做同样的事情?

c# asp.net-mvc connection-timeout polly

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