我正在尝试创建一个web应用程序,我希望能够插入单独的程序集.我正在使用MVC预览4和Unity结合依赖注入,我用它来从我的插件程序集创建控制器.我正在使用WebForms(默认的aspx)作为我的视图引擎.
如果我想使用一个视图,我会坚持核心项目中定义的视图,因为ASPX部分的动态编译.我正在寻找一种将ASPX文件封装在不同程序集中的正确方法,而无需完成整个部署步骤.我错过了一些明显的东西吗 或者我应该以编程方式创建我的观点?
更新:我改变了接受的答案.尽管戴尔的答案非常彻底,但我还是选择了不同的虚拟路径提供商.它的工作方式就像一个魅力,我认为完全只需要20行代码.
你在视图中放了什么?
最近博客从斯科特Hanselman的有关使用一个特殊的模型绑定,方便测试使我想到了以下几点:你放什么在你的控制器逻辑构建视图模型,哪些应放在有何看法?他做的是这样的:
var viewModel = new DinnerFormViewModel {
Dinner = dinner,
Countries = new SelectList(PhoneValidator.Countries, dinner.Country)
};
return View(viewModel);
Run Code Online (Sandbox Code Playgroud)
现在,我使用相同的方式将数据传递给我的视图,但我不确定他如何处理Countries属性.您可以争辩双方:在SelectList中包装Country列表会为视图准备数据,就像创建一个viewmodel DTO来传递数据一样.另一方面,它有点像你专门操作下拉列表中使用的数据,限制了视图处理来自控制器的数据的方式.我觉得这对于视图和控制器之间的关注点分离是一个灰色区域,我无法真正决定走哪条路.对此有什么最佳做法吗?
PS:为了简单起见,让我们假设默认的ASP.NET MVC上下文,所以基本上你的开箱即用项目.默认视图引擎和所有爵士乐.
我一直在尝试使用WCF进行MSMQ,但我似乎无法让它正常工作.通过使用WCF和服务引用,我得到了客户端(它向队列发送消息).执行此操作的代码或多或少是这样的:
static void Main(string[] args)
{
var client = new MsmqServiceReference.MsmqContractClient();
client.SendMessage("TEST");
client.Close();
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
其中MsmqContractClient是我添加服务引用时由visual studio生成的代理.app.config中的端点指向msmqueue:
<client>
<endpoint
address="net.msmq://localhost/private/MsmqService/MsmqService.svc"
binding="netMsmqBinding"
bindingConfiguration="MsmqBindingNonTransactionalNoSecurity"
contract="MsmqServiceReference.IMsmqContract" name="MsmqService" />
</client>
Run Code Online (Sandbox Code Playgroud)
这样可以将消息发布到队列中.
现在我试图让服务真正起作用,但我一直收到这个错误:
绑定验证失败,因为绑定的MsmqAuthenticationMode属性设置为WindowsDomain但安装了MSMQ且禁用了Active Directory集成.无法打开通道工厂或服务主机.
我尝试过的事情是:
为每个人提供对队列的完全访问权限(包括匿名登录)
使用以下命令配置应用程序以使用配置文件中的特定绑定:
<bindings>
<netMsmqBinding>
<binding name="MsmqBindingNonTransactionalNoSecurity"
deadLetterQueue="Custom"
exactlyOnce="false">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)我尝试在我自己的帐户和管理员帐户下运行IIS(7)中的应用程序池
让我感到困惑的是,它一直试图说服我,我正在尝试使用WindowsDomain身份验证来运行它.我声明我不想在安全模式设置为none的情况下这样做,对吗?
我的应用程序目前只是一个webforms asp.net网站,其中添加了WCF服务.
如果有人能够至少指出我正确的方向,我将非常感激,因为我已经花了太多时间在这上面.
看起来似乎忽略或覆盖了配置.完整的错误消息:
WebHost failed to process a request.
Sender Information: System.ServiceModel.Activation.HostedHttpRequestAsyncResult/63721755
Exception: System.ServiceModel.ServiceActivationException: The service '/MsmqService/MsmqService.svc' cannot be activated due to an exception during compilation. The exception message is: Binding validation …
Run Code Online (Sandbox Code Playgroud) 我们都知道测试OO系统的各种方法.但是,看起来我将要做一个我将处理PLC梯形图逻辑的项目(不要问:/),我想知道是否有一种很好的方法来测试系统的有效性.
到目前为止,我看到的唯一方法就是构建一个包含系统所有已知状态的巨大表,以及生成的输出状态.对于简单的'如果输入A打开,则在'情况下转动输出B'.我认为这不适用于更复杂的结构.
作为一个侧面项目,我正在为一个我曾经玩过的古老游戏编写服务器.我试图让服务器尽可能松散耦合,但我想知道什么是多线程的好设计决策.目前我有以下一系列行动:
我假设平均有100个客户,因为这是游戏任何给定时间的最大值.对于整个事物的线程,什么是正确的决定?我目前的设置如下:
这将导致总共102个线程.我甚至考虑给客户端2个线程,一个用于发送,一个用于接收.如果我这样做,我可以在接收器线程上使用阻塞I/O,这意味着线程在平均情况下将大部分处于空闲状态.
我主要担心的是,通过使用这么多线程,我将占用资源.我并不担心竞争条件或死锁,因为这是我无论如何都要处理的事情.
我的设计是这样设置的,我可以使用单个线程进行所有客户端通信,无论它是1还是100.我已将通信逻辑与客户端对象本身分开,因此我可以实现它而无需重写很多代码.
主要问题是:在应用程序中使用超过200个线程是错误的吗?它有优势吗?我正在考虑在多核机器上运行它,它会像这样多个核心占用很多优势吗?
谢谢!
在所有这些线程中,大多数线程通常会被阻塞.我不认为连接速度超过每分钟5次.来自客户端的命令很少会出现,我平均说每分钟20个.
按照我得到的答案(上下文切换是我正在考虑的性能打击,但我不知道,直到你指出它,谢谢!)我想我会采用一个听众,一个方法接收者,一个发送者和一些杂项;-)
这是情况.我有一个webservice(C#2.0),它主要由一个继承自System.Web.Services.WebService的类组成.它包含一些方法,所有方法都需要调用一个方法来检查它们是否被授权.
基本上是这样的(原谅架构,这纯粹是一个例子):
public class ProductService : WebService
{
public AuthHeader AuthenticationHeader;
[WebMethod(Description="Returns true")]
[SoapHeader("AuthenticationHeader")]
public bool MethodWhichReturnsTrue()
{
if(Validate(AuthenticationHeader))
{
throw new SecurityException("Access Denied");
}
return true;
}
[WebMethod(Description="Returns false")]
[SoapHeader("AuthenticationHeader")]
public bool MethodWhichReturnsFalse()
{
if(Validate(AuthenticationHeader))
{
throw new SecurityException("Access Denied");
}
return false;
}
private bool Validate(AuthHeader authHeader)
{
return authHeader.Username == "gooduser" && authHeader.Password == "goodpassword";
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,Validate
必须在每种方法中调用该方法.我正在寻找一种能够调用该方法的方法,同时仍然能够以理智的方式访问soap标头.我看过那里的事件global.asax
,但我认为我不能访问该课程中的标题......我可以吗?
我正在尝试使用ANTLR解析CSS,或者至少是基础知识.我的lexer规则遇到了一些问题.问题在于ID选择器和十六进制颜色值之间的模糊性.为清晰起见,使用简化的语法,请考虑以下输入:
#bbb {
color: #fff;
}
Run Code Online (Sandbox Code Playgroud)
以及以下解析器规则:
ruleset : selector '{' property* '}';
selector: '#' ALPHANUM;
property: ALPHANUM ':' value ';' ;
value: COLOR;
Run Code Online (Sandbox Code Playgroud)
和这些词法分析器:
ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为#bbb被标记为COLOR标记,即使它应该是一个选择器.如果我将选择器更改为不以十六进制字符开头,则它可以正常工作.我不知道如何解决这个问题.有没有办法让ANTLR将特定令牌仅作为COLOR令牌处理,如果它在某个位置?比方说,如果它属于属性规则,我可以放心地认为它是一个颜色标记.如果不是,请将其视为选择器.
任何帮助,将不胜感激!
解决方案:原来我试图在语法中做太多,我应该在使用AST的代码中处理.CSS有太多不明确的令牌可靠地分成不同的令牌,所以我现在使用的方法基本上是对'#','.',':'和花括号等特殊字符进行标记,并在消费者代码.工作得更好,处理边缘情况更容易.
我有一个基本上必须做这样的查询的系统:
SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)
Run Code Online (Sandbox Code Playgroud)
使用vanilla SQL参数时这很简单,你只需要以非典型的方式创建参数(其中builder变量是我用来创建矩形的SqlGeometryBuilder):
command.Parameters.Add(new SqlParameter
{
UdtTypeName = "geometry",
Value = builder.ConstructedGeometry,
ParameterName = "@paremeter"
});
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试使用dapper这样做时,我得到一个错误,它无法弄清楚如何将其用作参数.任何有这个工作的人,或者有关如何启用此功能的任何指示?我有一个解决方法,但这涉及使用字符串表示并将其转换为我的SQL查询中的几何类型.我真的不想那样.
要回答评论,我得到的错误是'Microsoft.SqlServer.Types.SqlGeometry类型的成员参数不能用作参数值'.换句话说,dapper不知道如何将SqlGeometry对象作为参数处理.
我有一个使用ASP.NET MVC3和Ninject.Web.MVC(MVC3版本)的简单Web应用程序.
整个过程正常,除非应用程序结束.每当它结束时,就会释放内核,如NinjectHttpApplication中的Application_End()所示:
反射器告诉我这个:
public void Application_End()
{
lock (this)
{
if (kernel != null)
{
kernel.Dispose();
kernel = null;
}
this.OnApplicationStopped();
}
}
Run Code Online (Sandbox Code Playgroud)
发生的事情是我的网络服务器出现了StackOverflowException(我在VS2010中尝试了IIS7和内置的web服务器).我只能假设这是出错的地方,因为我自己没有在应用程序端编写任何代码.
我发现内核知道如何解析IKernel(它返回内核本身),这可能会导致堆栈溢出吗?我可以想象会发生这样的事情:
换句话说,内核被释放,处理它所拥有的所有引用(包括自引用),这会导致它自行处理.
这有意义吗?
似乎问题出在NinjectHttpApplication中.看看这个激活码:
public void Application_Start()
{
lock (this)
{
kernel = this.CreateKernel();
...
kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
...
}
}
Run Code Online (Sandbox Code Playgroud)
看起来没问题,但现在发生的事情是每当调用IResolutionRoot时,内核都会缓存在自身内部.在处置内核时,清空缓存会释放所有缓存的对象,从而导致循环引用.
NinjectHttpApplication的一个简单解决方案是简单地更改绑定.将常量绑定更改为方法一:
kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
Run Code Online (Sandbox Code Playgroud)
变
kernel.Bind<IResolutionRoot>().ToMethod(x => this.Kernel);
Run Code Online (Sandbox Code Playgroud)
这解决了问题,但我不确定整个循环处置缓存问题是否是ninject中的错误.