小编Ayo*_*o I的帖子

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

HasKey抛出InvalidOperationException - 这是Entity Framework Code First中的错误吗?

好吧,我一直盯着屏幕看了几个小时,不知道为什么我会收到这个错误.我在其他一些项目上使用过Code First,之前没有遇到任何问题...

这是错误:

System.InvalidOperationException was unhandled by user code
  Message=The properties expression 'sci => sci.ShoppingCartItemId' is not valid. The expression should represent a property: C#: 't => t.MyProperty'  VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }'  VB.Net: 'Function(t) New From { t.MyProperty1, t.MyProperty2 }'.
  Source=EntityFramework
  StackTrace:
       at System.Data.Entity.ModelConfiguration.Utilities.ExpressionExtensions.GetSimplePropertyAccessList(LambdaExpression propertyAccessExpression)
       at System.Data.Entity.ModelConfiguration.EntityTypeConfiguration`1.HasKey[TKey](Expression`1 keyExpression)
       at BillingPlatform.DataLayer.BillingDb.OnModelCreating(DbModelBuilder modelBuilder) in [somepath]\BillingDb.cs:line 57
       at System.Data.Entity.Internal.LazyInternalContext.CreateModelBuilder()
       at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
       at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
  InnerException: 
Run Code Online (Sandbox Code Playgroud)

这是抛出错误的代码.第一行:

protected …
Run Code Online (Sandbox Code Playgroud)

entity-framework code-first entity-framework-4.1

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

为什么log4net线程会等待?

上周,我们的一个测试服务器用完了日志驱动器上的磁盘空间.在释放磁盘空间后,我仍然有几个带调用堆栈的线程似乎被卡在log4net AppenderSkeleton.DoAppend中,这让我感到困惑,因为我期望log4net是线程安全的.

  1. 在看到线程卡住时,我是否正确读取堆栈?
  2. 堆栈是否表示线程卡在"锁定(此)"或其他位置?我的猜测在其他地方,因为我希望看到像Monitor.Enter这样的东西,如果它被锁定(这个).
  3. 其中一个主题似乎在转换到新文件的过程中显示DoAppend.是否可以在创建此文件时阻止所有DoAppend线程?但是,我希望在释放磁盘空间后,这些线程会被解除阻塞.

任何帮助理解为什么log4net似乎被困在如此多的线程中,这是值得赞赏的.

下面是一个示例调用堆栈,显示在DoAppend内等待时阻塞的线程:

ntdll.dll!_ NtWaitForMultipleObjects @ 20()+ 0x15 bytes
ntdll.dll!_NtWaitForMultipleObjects@20()+ 0x15 bytes
KERNELBASE.dll!_WaitForMultipleObjectsEx@20()+ 0x36 bytes kernel32.dll!_WaitForMultipleObjectsExImplementation@20()+ 0x8e bytes [管理到本机转换]
log4net.dll!log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent loggingEvent)+ 0x3e bytes log4net.dll!log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(log4net.Core.LoggingEvent loggingEvent)+ 0xa0 bytes
log4net.dll!log4net.Repository.Hierarchy.Logger.CallAppenders( log4net.Core.LoggingEvent loggingEvent)+ 0xa9 bytes
log4net.dll!log4net.Repository.Hierarchy.Logger.ForcedLog(System.Type callerStackBoundaryDeclaringType,log4net.Core.Level level,object message,System.Exception exception)+ 0x4a bytes
log4net.dll !log4net.Repository.Hierarchy.Logger.Log(System.Type callerStackBoundaryDeclaringType,log4net.Core.Level level,object message,System.Exception exception)+ 0x5e bytes
log4net.dll!log4net.Core.LogImpl.Info(object message)+ 0x27字节

这是log4net AppenderSkeleton.DoAppend的源代码

public void DoAppend(LoggingEvent loggingEvent) 
{
    // This lock is absolutely critical for correct formatting
    // of the message in a multi-threaded environment. …
Run Code Online (Sandbox Code Playgroud)

c# log4net multithreading

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

LogicalCallContext在Console App中流过await但不在VS UnitTest中流动

我正在使用Logical CallContext在一系列等待中回传信息.有趣的是,在我的测试控制台应用程序中,一切正常.但是,当在VS UnitTest的上下文中运行我的单元测试时,调用上下文似乎没有流过等待.

方法内部:SendRequestAsyncImpl正在设置调用上下文,当我在方法返回时从断点查询逻辑调用上下文时,调用上下文设置得很好.

但是,在await返回以下行之后:

Message response = await SendRequestAsyncImpl(m, true).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

逻辑调用上下文为空.我想也许可以通过设置ConfigureAwait(true)而不是false来解决问题.但这并不能解决问题.

无论我尝试流动什么,甚至在SendRequestAsyncImpl中设置一个简单的值类型,如:

System.Runtime.Remoting.Messaging.CallContext.LogicalSetData("flag", true);
Run Code Online (Sandbox Code Playgroud)

await后无法检索.

为什么这可以从我的控制台应用程序工作 但不是从我的单元测试?有什么不同?(我已经看到了其他一些涉及AppDomain问题的堆栈溢出问题.但是我甚至无法在整个等待期间编组一个bool.编组数据的能力似乎不是问题.)

c# remoting vs-unit-testing-framework async-await

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

此请求的授权被拒绝 - Azure Active Directory - 可用的日志是什么?

因此,我正在使用带有OAuth 2.0进程的邮递员尝试通过Azure Active Directory对我的WebApi进行身份验证.我仍然使用基本的ValuesController进行默认项目,只是尝试使身份验证和授权工作.

我已经按照这个视频来设置邮递员,据我所知,我已经按照描述在活动目​​录中配置了新的应用程序.

令牌交换正在运行.授权承载{token}正在正确发送.这是一个示例标记:

{承载eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IlliUkFRUlljRV9tb3RXVkpLSHJ3TEJiZF85cyIsImtpZCI6IlliUkFRUlljRV9tb3RXVkpLSHJ3TEJiZF85cyJ9..NXpvslBXOpRNkmWQqj7XqVzloS3KoeSqPIlo-yUPGYkZ4bHPrAH6yD4sxMYz-19VIPFRDUMP-5h5hmaMKmuykjNUltz6wejQT9f4IeV6i7VtP3BlkfASZeAdKAiSjKh6ydV8PuJjV2HHh2WvxIKC3QQXzROwWAdeXLcgMTiKSBMULzFV8BsecgtI86_L2OISgbQZ2LgF137EPJoG7C4L1IO-10T1QIVl-Emy6AS0VKVxdzjCgiT-DFtccxME6n1CruoDy6mTKztcAkiFR1IlgY6Fvj-Y_goMQyxA5sCRebWnOQ5jeUKv4KNyNWOLJU_RiZYe0kj4IT3KDc9jjtHykg}

但是,即使我成功获得令牌,当我在VS中逐步调试调试器时,我看到令牌进入,授权失败.我收到以下回复:

{"Message":"Authorization has been denied for this request."}
Run Code Online (Sandbox Code Playgroud)

问题似乎在服务器端.当我重写IsAuthorized以返回true时,它可以工作.

在Azure中,两个应用程序都位于具有委派权限的同一目录中.

是否有任何日志我可以查看确切的拒绝原因?从那里我可以弄清楚发生了什么.

我已经开启了跟踪,其中:

// Web API configuration and services
var traceWriter = config.EnableSystemDiagnosticsTracing();
traceWriter.IsVerbose = true;
traceWriter.MinimumLevel = TraceLevel.Debug;
Run Code Online (Sandbox Code Playgroud)

但它并没有真正告诉我为什么我会拒绝.

azure oauth-2.0 azure-web-sites azure-active-directory asp.net-web-api2

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

WiX - 在安装时设置合并模块目录?

我按照入门Wix指南中的说明创建了一个合并模块:http://wix.sourceforge.net/manual-wix2/authoring_merge_modules.htm .

这是合并模块wxs:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Module Id="SomeRepositoryMergeModule" Language="1033" Version="1.0.0.0">
    <Package Id="f11e7321-a687-4d53-8be7-21a8ae0721a6" Manufacturer="SomeCompany Technologies" InstallerVersion="200" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
          <Directory Id="MODULEINSTALLLOCATION" Name="Some Repository">
            <Component Id="ServicesHostWindowsService" Guid="257D1FAE-4AFF-4155-BDB8-D81F50E5862B">
              <File Id="ServicesHostInstallerExecutable" KeyPath="yes" DiskId="1" Name="WindowsServiceHost.exe" Source="..\WindowsServiceHost\bin\Output_For_Installer\WindowsServiceHost.exe" />
              <File Id="ServicesHostConfig" KeyPath="no" DiskId="1" Name="WindowsServiceHost.exe.config" Source="..\WindowsServiceHost\bin\Output_For_Installer\WindowsServiceHost.exe.config" />
              <File Id="SomeCompanyCommon" KeyPath="no" DiskId="1" Name="SomeCompany.Common.dll" Source="..\WindowsServiceHost\bin\Output_For_Installer\SomeCompany.Common.dll" />
              <File Id="SomeRepositorySqlScript" KeyPath="no" DiskId="1" Name="SomeRepository.sql" Source="..\..\..\..\..\DB\SomeRepository\SomeRepository.sql" />
              <File Id="LogConfigXml" KeyPath="no" DiskId="1" Name="log.config.xml" Source="..\WindowsService\log.config.xml" />
              <ServiceInstall Id="ServicesHostInstallElement" ErrorControl="normal" Start="auto" Type="ownProcess" Vital="yes"
                              Name="AServer WindowsService Host"
                              Description="The windows service responsible for hosting SomeCompany …
Run Code Online (Sandbox Code Playgroud)

wix merge-module wix3.5

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

sp_getapplock用于同步对内存表的并发访问

我有大约20个存储过程相互消耗,形成一个树状的依赖链.

但是,存储过程使用内存表进行缓存,并且可以从许多不同的客户端同时调用.

为防止针对内存表的并发更新/删除尝试,我使用sp_getapplock和SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ON;.

我正在使用每个存储过程唯一的存储过程参数的散列,但是对具有相同参数的同一存储过程的多个并发调用应生成相同的散列.对于使用相同参数的同一存储过程的并发调用,这是哈希的相等,这为我提供了一个有用的资源名称来获取我们的applock.

以下是一个例子:

BEGIN TRANSACTION

EXEC @LOCK_STATUS = sp_getapplock @Resource= [SOME_HASH_OF_PARAMETERS_TO_THE_SP], @LockMode = 'Exclusive';

...some stored proc code...

IF FAILURE
BEGIN
  ROLLBACK;
  THROW [SOME_ERROR_NUMBER]
END

...some stored proc code...

COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

尽管在应用程序中包装所有内容应该阻止任何并发更新或删除,我仍然得到错误41302:

当前事务尝试更新自此事务启动以来已更新的记录.交易中止.在批处理结束时检测到不可提交的事务.该事务被回滚.

我是否正确使用sp_getapplock?似乎我建议的方法应该有效.

sql-server concurrency stored-procedures sql-server-2014

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

关于*的困惑?正则表达式运算符

所以我想使用下面的正则表达式搜索字符串:

border-.*\.5pt
Run Code Online (Sandbox Code Playgroud)

找到所有border-top,border-bottom在与的边框厚度文件等CSS属性.5pt.它通常效果很好,但它太贪心了.

例如,以下所有内容都以单个匹配的形式返回:

border-top:solid #1F497D .5pt;border-bottom:solid #1F497D .5pt
Run Code Online (Sandbox Code Playgroud)

我希望这两个CSS属性是两个单独的匹配.

所以我试着将我的正则表达式修改为:

border-.*?\.5pt
Run Code Online (Sandbox Code Playgroud)

?它来使它不贪婪.但是,在修改之后,没有任何匹配.

谁能解释为什么我看到这种行为?我错过了什么?

(如果值得了解的话,我在进行此搜索时使用的是Microsoft Expression Web的"使用正则表达式查找".)

regex microsoft-expression-web regex-greedy

0
推荐指数
1
解决办法
109
查看次数