我有两个应用程序域,一个父级创建子域.在子域中,有一个MarshalByRef对象,使用.NET Remoting进行通信.在父域中运行的对象作为应用程序函数的一部分调用远程对象的包装器:
public class ScanningTask : Task
{
private class Loader : MarshalByRef
{
public void Load(IEnumerable<string> paths)
{
...
}
public event EventHandler<LoadEventArgs> OnLoad;
}
public void RunTask()
{
var domain = AppDomain.CreateDomain("LoadDomain");
var loader = (Loader)domain.CreateInstanceFromAndUnwrap(
typeof(Loader).Assembly.Location,
typeof(Loader).FullName);
loader.Load(...);
AppDomain.Unload(domain);
}
}
Run Code Online (Sandbox Code Playgroud)
大多数代码都是为了简洁而删除
此Loader对象公开了OnLoad我想要在父域中捕获的事件.如果我只是添加一个事件处理程序委托,它会尝试序列化ScanningTask到子域中并抛出一个关于它不可序列化的异常.
我真正想要的是让事件跨域传播.任何聪明的建议如何?
我的MSBuild构建脚本在所有开发机器上执行正常,但无法在构建服务器上运行,但Trunk构建除外.分支全部失败,并显示以下警告,指出问题的根源:
Target "ResolveProjectReferences":
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets (0,0):
warning : The referenced project '..\..\..\Class Library\
Company.BusinessModel\Company.BusinessModel.csproj' does not exist.
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么这个错误甚至出现 - 我已经验证了(相对于正在处理的csproj)引用的项目确实存在.将签出的代码复制(文件复制)到我的本地计算机并运行脚本,构建按预期完成.
这里有什么明显的错误吗?我能检查一下试图解决这个谜团吗?
编辑:
我已经尝试针对项目运行MSBuild单独提出构建错误,因此问题的其余部分不是问题,只是关于这个特定的.csproj文件.
我正在尝试使用Katana项目提供的OpenID Connect身份验证中间件.
实现中存在一个错误,在这些情况下会导致死锁:
SignOut身份验证方法.由于身份验证中间件处理来自主机发送标头的回调信号,因此发生死锁.问题的根源在于此方法:
private static void OnSendingHeaderCallback(object state)
{
AuthenticationHandler handler = (AuthenticationHandler)state;
handler.ApplyResponseAsync().Wait();
}
Run Code Online (Sandbox Code Playgroud)
来自Microsoft.Owin.Security.Infrastructure.AuthenticationHandler
Task.Wait()只有在返回Task已完成时,调用才是安全的,而在OpenID Connect中间件的情况下,调用尚未完成.
中间件使用一个实例Microsoft.IdentityModel.Protocols.ConfigurationManager<T>来管理其配置的缓存副本.这是一个asychnronous实现,使用SemaphoreSlim异步锁和HTTP文档检索器来获取配置.我怀疑这是死锁Wait()调用的触发器.
这是我怀疑的原因:
public async Task<T> GetConfigurationAsync(CancellationToken cancel)
{
DateTimeOffset now = DateTimeOffset.UtcNow;
if (_currentConfiguration != null && _syncAfter > now)
{
return _currentConfiguration;
}
await _refreshLock.WaitAsync(cancel);
try
{
Exception retrieveEx = null;
if (_syncAfter <= now)
{
try
{
// Don't use the individual …Run Code Online (Sandbox Code Playgroud) 我们每天都在讨论异常处理.我们都知道它是在执行遇到某些意外情况时创建的东西.
这里有几个问题:
什么是例外?什么是它最低级别的内存组合?在.NET中,我可以将其视为某种异常类型的对象实例.在本土世界,它是由什么组成的?一些数据是否存在?
如果程序员没有明确抛出异常,谁会创建异常,如下面的代码所示?它是某些语言运行库提供的支持的一部分吗?
SomeException e = new SomeException(); 扔掉;
什么是工作范例的例外?是否真的发生了一些错误,语言运行时会创建相应数据结构/类型的实例以表示错误的详细信息?
我们怎么能在运行时知道所有可能的意外情况,从而创建足够的异常数据结构/类型来表示它们?
谢谢你的回复.
我收到一个Base64字符串,它实际上是PDF文件的字符串表示形式.我想用Response.Write写这个字符串,但不将其转换回二进制表示.
我试过这个:
var base64string = "...";
Response.Write(base64String);
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Transfer-Encoding", "base64");
Run Code Online (Sandbox Code Playgroud)
浏览器无法将内容识别为base64编码的PDF文件.我怎样才能解决这个问题?
编辑:这是回应
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/pdf; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Content-Transfer-Encoding: base64
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 11 Apr 2012 11:00:04 GMT
Content-Length: 107304
JVBERi0xLjQKJeLjz9MKMSA... more content here
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个类库的系列,这些类在组织内的多个应用程序之间使用.其中一些应用程序面向.NET 3.5和一些目标4.0.
我们希望提供两个版本的程序集,一个定位3.5,一个定位4.0,以便主机应用程序可以选择最适合它们的程序集.
3.5和4.0版本之间存在一些细微差别:
有没有任何解决方案可以让我重复使用代码库的重叠部分,并防止简单地分叉源树?
我的目标是生成针对其指定框架的多个版本的程序集,这些框架可以滚动到NuGet包中并在我们的内部订阅源上公开.
我让TeamCity在多个Mercurial分支机构中构建配置.作为构建过程的一部分,我想根据构建的分支命名一些输出.
我试过使用$(TEAMCITY_BUILD_BRANCH),尝试teamcity.build.branch从TeamCity 获取属性,但我只得到一个空字符串.我成功地$(BUILD_NUMBER)将build.number属性放入脚本中,所以我对所需要的内容感到困惑.
我正在尝试将监听器附加到正在运行的进程,该进程使用EventSource跟踪处理事件.我已经通过继承EventListener和(可能)需要调用EnableEvents以开始接收信息来创建我自己的监听器.
所有重载的第一个参数是EventSource配置和发送消息,但我不清楚如何在需要识别外部进程中的事件源时组成该实例.
我只是将它们作为一个概念验证,因此代码在控制台应用程序中运行,并且TestEventListener只是尝试将事件写入控制台窗口.
EventSource source = null;
using (var listener = new TestEventListener())
{
listener.EnableEvents(source, EventLevel.Verbose);
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud) 在处理异步操作的取消时,我习惯于能够执行异步模式:
public async Task InvokeAsync(CancellationToken cancellationToken)
{
using(cancellationToken.Register(handler.Stop))
{
try
{
await handler.HandleAsync();
}
catch(HandlerStoppedException ex)
{
cancellationToken.ThrowIfCancellationRequested();
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
该方法调用一个异步组件,该组件公开某种取消机制.当请求令牌信号取消时,取消令牌设置回调以调用取消机制.
我可以在测试中调用此方法在超时内运行其功能.
async Task TestInvoke()
{
using (var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(10))
{
try
{
await InvokeAsync(timeout.Token);
}
catch (TaskCancelledException ex)
{
if (ex.CancellationToken == timeout.Token)
{
throw new TimeoutException(
"Operation failed to complete in the allowed time.", ex);
}
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的期望是OperationCanceledException在async方法内抛出会导致方法Task返回到"已取消"状态.然后我期待任何等待这个被取消的任务的尝试应该抛出一个TaskCanceledException.
在我目前的场景中(代码与上面的代码非常类似)我OperationCanceledException在等待任务时得到了一个.如果我检查任务的状态,我可以看到它处于"已取消"状态并且没有与之关联的异常.
更奇怪的是,如果我调用Wait() …
c# ×5
.net ×3
async-await ×2
msbuild ×2
appdomain ×1
asp.net ×1
c++ ×1
events ×1
exception ×1
http ×1
msbuild-4.0 ×1
owin ×1
system.web ×1
teamcity ×1
teamcity-7.0 ×1
trace ×1
wix ×1