我有一个使用Windows身份验证的ASP.NET Web应用程序.此应用程序需要连接到另一个ASP.NET Web服务(也使用Windows身份验证)并使用从用户的浏览器收到的相同凭据.可以这样做,怎么做?
我有一个对象,它将一个特别复杂的接口的实现委托给子对象.这正是我认为的工作TAggregatedObject." child "对象维护对其" 控制器 " 的弱引用,并且所有QueryInterface请求都传递回父级.这样可以保持IUnknown
始终为同一对象的规则.
所以,我的父(即"Controller")对象声明它实现了IStream接口:
type
TRobot = class(TInterfacedObject, IStream)
private
function GetStream: IStream;
public
property Stream: IStream read GetStrem implements IStream;
end;
Run Code Online (Sandbox Code Playgroud)
注意:这是一个假设的例子.我选择这个词
Robot是因为它听起来很复杂,并且单词只有5个字母 - 它很短.我也选择IStream因为它的短.我打算使用IPersistFile或IPersistFileInit,但它们更长,并使示例代码更难实现.换句话说:这是一个假设的例子.
现在我有我的子对象将实现IStream:
type
TRobotStream = class(TAggregatedObject, IStream)
public
...
end;
Run Code Online (Sandbox Code Playgroud)
所有剩下的,这就是我的问题开始的地方:创建RobotStream它被要求的时间:
function TRobot.GetStream: IStream;
begin
Result := TRobotStream.Create(Self) as IStream;
end;
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,错误Operator not applicable to this operand …
在我当前的项目中,几个视图控制器(如vc)生成operation在静态NSOperationQueue上执行的NSOperation对象(如).当操作正在等待或运行时,它将通过委托(报告operation.delegate = vc未保留)向视图控制器报告.
这些操作可能需要一段时间,同时应用程序可以取消分配视图控制器(通过弹出导航控制器的堆栈).
到目前为止,一切都是故意的.包含静态NSOperationQueue的类有一种方法可以返回操作,因此视图控制器不会保留它们.它们只是alloc/init/autoreleased并放入队列.
现在这也导致了这个问题.在视图控制器解除分配后,对NSOperation的激烈委托的任何调用都将导致错误的访问冲突.根据我的理解,无法检查指针上的对象是否已被解除分配,如本问题所述.
我能想到的一个修复是保留操作并在dealloc上将operation.delegate设置为nil.但这是我最不受欢迎的解决方案,因为它会引入许多额外的ivars /属性来跟踪.
因此,我的问题是,有没有其他方法可以解决这个问题,如果是这样,你能在这里草拟一个吗?
干杯,
EP.
解决方案:对我来说最好的方法是对Guiliano的回答略有不同:
在队列管理器中实现每个委托协议是不可行的(20多种不同的协议,使用50多种方法),因此我保留了直接委托分配.我改变的是进行分配呼叫的班级.这曾经是创建请求的类(和委托),但现在它被卸载到队列管理器.
除了将委托分配给操作之外,队列管理器还拥有辅助可变字典以跟踪委托/操作对.
每个委托实例都会调用一个[QueueManager invalidateDelegate:self]deallocation方法,然后查找属于该委托的请求并将其取消.然后还删除字典操作/委托对以允许适当地重新分配操作.
最后,当KVO观察isFinished每个操作的属性时,可变dict保持清洁,以确保所有操作保留计数在它们完成后实际解除分配.
感谢Guiliano提供使用KVO破解这一点的提示!
exc-bad-access delegation objective-c nsoperation nsoperationqueue
文档指出接口委派仅适用于Win32.目前我无法测试它,是否在64位编译器中停止了文档错误或接口委托?
我见过几个类似的问题,但没有人解释为什么委托仅限于接口?
在实践中大多数时候我们都有一些实际上根本没有接口的东西,它是一个不实现任何功能但只提供一些功能或实现抽象类的类.
是否有任何基本限制迫使其仅限于接口,或者我们是否可以期望kotlin将来能够不受限制地授权?
如果我们想要使用组合而不是继承来扩展类的功能,这将特别有用.
class A {}
class B(val a: A) : A by a {}
Run Code Online (Sandbox Code Playgroud) 我有两个独立的自制应用程序需要相互通信.一个是前端应用程序(实际上是asp.net),另一个是会计应用程序的后端接口.后端接口不是专门为此前端创建的 - 它是许多其他应用程序用于与我们的产品集成的通用接口.
为方便用户,我们希望在前端应用程序中提供Windows身份验证.这意味着我们需要将凭据传递给后端应用程序,后端应用程序必须检查它们.
我们不希望将我们的前端设置为后端的"可信"应用程序,后端可以作为任何用户进行身份验证.如果前端被黑客入侵,那么它也会破坏后端系统.
据我了解,使用Windows身份验证执行此操作的一种方法是Kerberos委派.但是,这需要为要委派的用户和执行委派的计算机(带有我们的前端的服务器)显式启用.默认情况下,这些选项在Active Directory中被禁用,我怀疑许多系统管理员将保留关于为所有用户启用它们的保留.
此外,我不确定这是Kerberos代表团的意图.我不需要我们的前端来冒充连接的用户.我只需要证明这个用户已经对我进行了身份验证.
你会怎么做?
尝试列出特定文件夹中的目录和文件.此文件夹将取决于Windows身份验证(NTLM)登录的当前用户(Page.User),并从Active Directory(homedirectory属性)中检索.
我使用域用户访问AD并检索文件夹位置,这很好.
失败的是System.IO.DirectoryInfo.GetDirectories()即使使用模拟也要检索子文件夹.
这是我用于模仿的代码:
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
Run Code Online (Sandbox Code Playgroud)
我已经检查过被模拟的用户是否可以访问该文件夹.
从我到目前为止发现,似乎我需要设置委派或Kerberos身份验证,这是真的吗?这些是实现这一目标的唯一方法吗?模仿不应该够吗?
我是Objective-C的新手,但在Java方面经验丰富.在Java中是否存在Objective-C"委托"的等效概念,以便我可以更好地理解这个概念?是否有办法在Java中模拟委派概念?
我的观点TuneBook有几种类型的子视图ClosedTune.每个曲调我也有单独的整页视图OpenTune.同样的事件中约束ClosedTune和OpenTune,所以我设计我的应用程序,使他们无论从共享"抽象"视图继承Tune.
为了使我的应用程序更具可扩展性,我希望将每个事件ClosedTune委托给TuneBook,但为了可维护性,我希望使用相同的处理程序(存储在其中的处理程序Tune)TuneBook(尽管它们显然需要包含在某些函数中).
我遇到的问题是,TuneBook找到正确ClosedTune的调用处理程序.构建这个的好方法是什么,还是有其他好的解决方案将事件委托给父视图?
注意 - 不是Backbone View的重复:从父类继承和扩展事件(这是关于从父类继承的子节点,而我问的是DOM中父节点的子节点的子节点)
javascript model-view-controller events delegation backbone.js
如何在Kotlin中部分委托方法/字段?
具体来说:这里我试图User从接口继承类TraitA并marked: Boolean在包装器中实现字段StateA.这将清理User实现,因为marked它只是一个状态字段.注意,TraitA不能是一个类,因为我想使用几个这样的接口:User() : TraitA by StateA, TraitB by StateB, ..
/* does not compile (Kotlin M12) */
interface TraitA {
var marked: Boolean
fun doStaffWithMarked() // must be overridable
}
class StateA() : TraitA {
override var marked = false
}
class User() : TraitA by StateA(){
override fum doStaffWithMarked() {
//...all fancy logic here...
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是在一个地方实现所有:
class User() : TraitA{
override var …Run Code Online (Sandbox Code Playgroud) delegation ×10
asp.net ×2
delphi ×2
interface ×2
kotlin ×2
objective-c ×2
.net ×1
backbone.js ×1
c# ×1
delphi-5 ×1
delphi-xe2 ×1
events ×1
java ×1
javascript ×1
kerberos ×1
nsoperation ×1