Udpclient 变量不断重置为 Null ASP.NET

Udpclient variable keeps resetting to Null ASP.NET

我正在开发一个使用 asp 网站作为 UDP 侦听器的小项目。问题是我使用了计时器,结果,它每次都会加载页面,导致 udpclient 一次又一次地重新连接到同一个端口,从而引发异常。

我在protected void Page_Load(object sender, EventArgs e)下用过if (!IsPostBack)用过一次,但因为是全局变量,所以不管怎样都变成null了。

我听说过 ViewState,但我不知道如何将它用于 udpclient 值。

下面是我的代码:

private const int listenPort = 6011;

IPEndPoint groupEP;
UdpClient listener;

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {
        listener = new UdpClient(listenPort);

        groupEP = new IPEndPoint(IPAddress.Any, listenPort);

    }

}


protected void Timer1_Tick(object sender, EventArgs e)
{
    Recive();
}

public void Recive()
{



    byte[] bytes = listener.Receive(ref groupEP);


    var width = 100; // for example
    var height = 100; // for example
    var dpiX = 96d;
    var dpiY = 96d;
    var pixelFormat = PixelFormats.Pbgra32; // for example
    var bytesPerPixel = (pixelFormat.BitsPerPixel + 7) / 8;
    var stride = bytesPerPixel * width;

    var bitmap = BitmapSource.Create(width, height, dpiX, dpiY,
                                     pixelFormat, null, bytes, stride);



    System.Drawing.Bitmap bitmap1;
    using (MemoryStream outStream = new MemoryStream())
    {
        BitmapEncoder enc = new BmpBitmapEncoder();

        enc.Frames.Add(BitmapFrame.Create(bitmap));
        enc.Save(outStream);
        bitmap1 = new System.Drawing.Bitmap(outStream);

        bitmap1.Save(HttpContext.Current.Server.MapPath("/image/bitmap.png"));
        Image1.ImageUrl = ("/image/bitmap.png");
    }


}

PostBacks 上的值为 null 是完全合理的。这是 ASP.NET 中的一个基本概念 - 如果您不在页面中保留某些内容,则下次加载页面时,它将为空。诸如 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"];
}