我有一个带LogTrace的ILogger接口(字符串值,params object []参数).现在我想验证是否调用了LogTrace并且要记录的字符串包含一些id.问题是它可以被不同地调用.例如1)LogTrace("MyString"+ id)2)LogTrace("MyString {0}",id)等等.
有没有一种方法可以让Moq验证所有场景?我只能想到创建一个手工制作的模拟器,它将格式化可用于验证的字符串.
Chrome的新版本增加了支持<link rel="preload">.他们发布了大量有关原始文档参考的信息.有人可以提供关于它如何工作的简单解释,与没有的情况相比有什么不同rel="preload".
我注意到,当我发布新的ASP.NET项目时,它会将所有非代码文件放在包中的根文件夹中.例如,这些文件最终到达:
没有必要在已发布的文件夹中包含这些内容.在旧的解决方案中,它就像修改文件的属性以排除它们一样简单.现在属性完全不同,并打开一个非常无用的对话框,您只能看到文件的路径.也许有可能采取其他方式吗?理想情况下,IDE应该足够聪明,不要发布这些常见文件,但对于某些自定义,它应该是一种排除它们的方法.
当然,一些额外的文件发布的问题当然不是很大,但排除它们也是有意义的.
PS可能的建议重复是不一样的,因为它只处理旧的项目/解决方案结构,而ASP.NET Core引入了一个新的,其他解决方案不适用.
我在我的应用程序中添加了一个JWT中间件:
app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} )
Run Code Online (Sandbox Code Playgroud)
没有趣的是,它会为所有操作抛出500异常(在以后的版本中应该更改为401),即使那些根本没有受到保护的(没有authorize属性).在我看来,这是错误的,但也许我自己做错了什么.
理想的情况是什么,我想实现的是,所有操作都在默认情况下保护(有针对以往ASP.NET过滤器),并且我会把匿名在那些我想公众或者是授权("SomePolicy")如果我想更多的策略,但我希望在没有令牌的情况下无法访问API.我如何在新的ASP.NET中执行此操作(我知道我可以从具有此属性的某个控制器继承,但我希望有更好的方法)?
我创建了一个非常简单的控制台应用程序,它连接到Azure ServiceBus并发送一条消息.我尝试了Microsoft(Microsoft.Azure.ServiceBus)的最新库,但不管我做什么,我只是得到这个错误:
无法建立连接,因为目标计算机主动拒绝它ErrorCode:ConnectionRefused
我在Service Bus Explorer中尝试了完全相同的连接字符串,它确实工作正常.此外,我使用Microsoft(WindowsAzure.ServiceBus)的旧库连接没有问题.
var sender = new MessageSender("endpoint", "topicName");
sender.SendAsync(new Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject("test"))));
Run Code Online (Sandbox Code Playgroud)
我尝试使用.NET Framework 4.6.2和Core,同样的例外.我怀疑这些库使用的默认协议可能存在一些差异,但我无法确定这一点.
PS尝试过Microsoft docs中的示例,但结果仍然是同样的例外
我试图找到答案,但似乎没有直接讨论过很多.我有一个我的应用程序的组合根,我创建一个DI容器并在那里注册所有内容,然后解决所有依赖项所需的顶级类.由于这一切都在内部发生 - 因此很难对组合根进行单元测试.你可以做虚拟方法,受保护的字段等等,但我不是为了能够进行单元测试而引入这些东西的忠实粉丝.其他类没有大问题,因为它们都使用构造函数注入.所以问题是 - 根本测试组合根是否有意义?它确实有一些额外的逻辑,但并不多,在大多数情况下,在应用程序启动期间会弹出任何故障.我有一些代码:
public void Initialize(/*Some configuration parameters here*/)
{
m_Container = new UnityContainer();
/*Regestering dependencies*/
m_Distributor = m_Container.Resolve<ISimpleFeedMessageDistributor>();
}
public void Start()
{
if (m_Distributor == null)
{
throw new ApplicationException("Initialize should be called before start");
}
m_Distributor.Start();
}
public void Close()
{
if (m_Distributor != null)
{
m_Distributor.Close();
}
}
Run Code Online (Sandbox Code Playgroud) 在我基于普通MVC和WebApi的应用程序中,我有两种不同的错误处理路径.
如果在WebApi调用期间发生错误,我会拦截它(使用标准的web api选项)并返回带有相应HTTP状态代码的json消息,以便客户端应用程序可以处理它.
如果错误发生在MVC中,那么我会使用一些标准处理程序,可能会根据状态代码将用户重定向到某个默认错误屏幕.
现在在ASP.NET Core中,两者都加入了相同的框架,所以如果我只是拦截并返回JSON,那么我冒险向用户显示json,因为它可以是一个返回视图的动作.另一方面,如果我使用app.UseExceptionHandler那么我的API调用将从错误页面获取HTML,这在js中是不可用的.
为这两种情况提供单独的错误处理的好方法是什么?或者也许有更好的方法来处理它?
PS我宁愿重用开箱即用的MVC异常处理程序,只添加web api部分.
error-handling asp.net-web-api asp.net-core-mvc asp.net-core
我已经将项目设置为在IIS上运行了一段时间,当我按F5时它确实连接没有问题.但最近这停止了工作,当我按F5 /按下时我确实收到了这个错误Debug->Start debugging:
无法在Web服务器上启动调试.远程服务器返回错误:(404)Not Found.
这是我的设置:
我不确定发生了什么,可能是一些VS更新或Windows更新,但我试图谷歌无处不在,没有任何工作.如前所述,附加到流程工作正常,但这种更简单的方法停止了这一操作.
更新:
尝试过Process Monitor来找出出错的地方,看起来w3wp尝试访问路径MyProjectFolder\debugattach.aspx,结果是"NAME NOT FOUND".不知道这是否是问题的根源.
我在 Azure 中创建了一个 ServiceBus 命名空间,以及一个主题和一个订阅。我还有一个简单的 Azure 版本 1 函数,它触发 ServiceBus 中接收到的主题,如下所示:
[FunctionName("MyServiceBusTriggerFunction")]
public static void Run([ServiceBusTrigger("myTopic", "mySubscription", Connection = "MyConnection")]string mySbMsg, TraceWriter log)
{
log.Info($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
}
Run Code Online (Sandbox Code Playgroud)
当我使用主题的共享访问策略在函数应用程序设置中定义连接字符串时,该函数可以很好地触发 ServiceBus 中的主题,如下所示:
Endpoint=sb://MyNamespace.servicebus.windows.net/;SharedAccessKeyName=mypolicy;SharedAccessKey=UZ...E0=
Run Code Online (Sandbox Code Playgroud)
现在,我想使用托管服务标识 (MSI) 来访问 ServiceBus,而不是共享访问密钥。根据这个(https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/services-support-msi)应该是可能的,除非我误解了一些东西。我还没有设法让它工作。
我试过的是
该功能未在此设置中触发,所以我错过了什么或我做错了什么?如果您有任何建议可以帮助我走得更远,我将不胜感激。谢谢。
triggers azureservicebus azure-functions azure-managed-identity
我已切换到在使用 C#8 的项目中启用可空。现在我有以下课程:
public class Request
{
public string Type { get; set; }
public string Username { get; set; }
public string Key { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
编译器当然抱怨它不能保证这些属性不会为空。除了添加接受不可为空字符串的构造函数之外,我看不到任何其他方法来确保这一点。
这对于一个小班级来说似乎很好,但是如果我有 20 个属性,这是在构造函数中列出所有属性的唯一方法吗?是否有可能以某种方式使用初始化程序强制执行它:
var request = new Request { Type = "Not null", Username = "Not null" }; // Get an error here that Key is null
Run Code Online (Sandbox Code Playgroud)
PS 有一个很好的答案,建议使用 iniatlizer 来处理属性,但这并不总是适用于例如Type不能只是初始化为某个随机值的类型