我正在开发一个使用asp网站作为UDP监听器的小项目。问题是我使用计时器,因此,它每次都会加载页面,导致udpclient一次又一次地重新连接到同一个端口,这会引发异常。
我在object GetProxy(Type iface, Type obj)
{
string name = obj.Name + "Proxy";
AssemblyBuilder assyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(name), AssemblyBuilderAccess.Run);
ModuleBuilder modBuilder = assyBuilder.DefineDynamicModule(name);
TypeBuilder typeBuilder = modBuilder.DefineType(name, TypeAttributes.Public | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit, obj, new Type[] { iface });
Type proxyType = typeBuilder.CreateType(); // Exception here
return Activator.CreateInstance(proxyType);
}
下使用if (!IsPostBack)
一次使用它,但因为它是一个全局变量,所以无论如何都会使它为空。
我听说过ViewState,但我不知道如何将它用于udpclient值。
下面是我的代码:
protected void Page_Load(object sender, EventArgs e)
答案 0 :(得分:1)
在PostBacks上,值为null是完全合理的。这是ASP.NET中的一个基本概念 - 如果您不在页面中保留某些内容,则下次加载页面时,它将为null。像TextBoxes或其他控件这样的东西保持其值的原因是因为ASP.NET在幕后做了一些魔术,并将控件的值序列化为ViewState,并在响应客户端时将其与HTML一起发送。然后,当发生PostBack时,会在HTTP请求中从客户端发回这些值,并且作为ASP.NET页面生命周期的一部分,值将从ViewState重新加载到控件。
有几种持久方法。评论中的一个人提到将变量存储为static
,这是你不应该做的(除非你希望加载它的每一个人都能点击每个页面同时访问同一个变量,因此引入并发问题来处理)。
在您的情况下,我建议使用Page.Session
仅保留变量服务器端(例如,没有客户端序列化)。持久化的此变量基于每个会话,因此两个不同的用户将无法访问相同的变量,这与使用static
的建议相反。像这样:
if (!IsPostBack)
{
listener = new UdpClient(listenPort);
Session["listener"] = listener;
}
else
{
listener = (UdpClient)Session["listener"];
}