c# - 方法在没有返回的情况下中断
问题描述
我正在尝试构建一个与网络资产对话的 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的属性有一些例外,这可能是原因吗?
解决方案
您正在从异步方法调用同步调用,请在您的控制器中尝试此操作
[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();
}
推荐阅读
- python - Django:如何比较两个不同的数据表的数据字段并获得完全正确的数据?
- pyspark - Spark 在进入下一个循环迭代之前是否会清除内存?
- android - 如何使现代 Multidex 与旧 API 上的仪器测试一起工作
- python - 如何在 matplotlib 中实现类别轴?
- python - 错误异常:在 rstudio 中使用带有 reticulate 的 python bar_chart_race 时,您的机器上没有安装 ffmpeg
- ansible - Ansible 处理程序未在角色中触发
- r - 年龄比例堆积条形图
- assembly - 为什么 x86 只有一种形式的条件移动,而不是立即数或 8 位?
- c - 调用 open 时如何调用 sys_open 而不是 sys_openat
- python - 多语言 DjangoCMS