首页 > 解决方案 > 方法在没有返回的情况下中断

问题描述

我正在尝试构建一个与网络资产对话的 api,所以我创建了一个实现与这些资产的连接和对话的类,但是在调试时,当断点while第二次命中时,控制台会触发,就好像它正在请求用户一样相互作用。

using Provisioning.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Provisioning.Contexts
{
    public class TL1Context : IDisposable, ITL1Context
    {
        private static readonly TcpClient _tcpClient = new TcpClient();
        public TL1Context(string addr, int port)
        {

            _tcpClient.Connect(addr, port);

            if (!_tcpClient.Connected)
                throw new TimeoutException("Not has possible connect to TL1 server.");

            Login();
        }

        public TL1Context()
        {
            _tcpClient.Connect("10.1.5.12", 3337);

            if (!_tcpClient.Connected)
                throw new TimeoutException("Not has possible connect to TL1 server.");

            Login();
        }
        private void Login()
        {
            var strin = $"LOGIN:::CTAG::UN=GEPON,PWD=GEPON;" +
                        $"LOGIN:::C000::UN=GEPON,PWD=GEPON;" +
                        $"SHAKEHAND:::CTAG::;";

            var returnedMessage = this.SendMessage(strin);
        }

        private string SendMessage(string Message)
        {
            try
            {
                var stream = _tcpClient.GetStream();

                byte[] messageSent = Encoding.ASCII.GetBytes(Message);

                stream.Write(messageSent);

                var messageReceived = new byte[1024];
                string textedMessage = string.Empty;
                using (var ms = new MemoryStream())
                {
                    int numBytesRead;
                    while ((numBytesRead = stream.Read(messageReceived, 0, messageReceived.Length)) > 0)
                    {
                        ms.Write(messageReceived, 0, numBytesRead);
                        textedMessage += Encoding.ASCII.GetString(ms.ToArray(), 0, (int)ms.Length);
                    }

                    Console.WriteLine("NOT EXECUTE THIS");
                    return textedMessage;
                }


            }
            catch (Exception e)
            {
                throw;
            }
        }

        public void Logout()
        {
            var strin = $"LOGOUT:::CTAG::;";
            this.SendMessage(strin);

        }

        public IList<ONUAvailable> GetOnusUnauthorizated(List<OLT> olts)
        {
            // TODO            
            foreach (var olt in olts)
            {
                var strin = $"LST-UNREGONU::OLTID={olt.IpAddress.ToString()}:CTAG::;" +
                    $"LST-UNREGONU::OLTID={olt.IpAddress.ToString()}:C000::;";
                var response = this.SendMessage(strin);
            }
            return null;
        }

        public void Dispose()
        {
            this.Logout();
            _tcpClient.Dispose();
        }
    }
}

用于调试的控制台应用程序

using Provisioning.Contexts;
using Provisioning.Models;
using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var tl1 = new TL1Context();

                    // NOT EXECUTE THIS
                    Console.WriteLine(tl1._tcpClient.Connected);
                    tl1.GetOnusUnauthorizated(new List<OLT>() {
                    new OLT() { IpAddress = new System.Net.IPAddress(new byte[] {192, 168, 99, 2 })
                    }
                    });


            }
            catch (Exception)
            {

                throw;
            }

        }
    }
}

在这两种情况下,TL1Context 的以下行都不会被执行

Console.WriteLine("NOT EXECUTE THIS");
return textedMessage;

@Edit:包含用于调试的控制台应用程序

@Edit:我意识到NetworkStream,TcpClient的属性有一些例外,这可能是原因吗?

在此处输入图像描述

标签: c#asp.net-mvcasp.net-core

解决方案


您正在从异步方法调用同步调用,请在您的控制器中尝试此操作

[HttpGet]
public async Task<ActionResult<string>> Test()
{
    try
    {
        //var tl1 = new TL1Context();
        //OnuAuthService.Test();
        var tl1 = Task.Run(() => new TL1Context());
        var TL1ContextOutput = await tl1;
    }
    catch (Exception e)
    {
        return BadRequest(e);
        throw;
    }

    return Ok();
}

推荐阅读