【发布时间】:2017-04-10 18:40:04
【问题描述】:
我正在尝试将 Web 套接字与我的机器人一起使用来与服务器通信。但是在运行时它会抛出 System.NullReferenceException。我在不同线程的后台运行套接字,这样它就不会干扰机器人。
我正在使用 WebsocketSharp 库。
第一条消息很好,但第二条消息在 HumanCollaboratorDialog 类的下一行抛出异常。
await context.PostAsync(e.Data);
我的套接字流类如下:
public static class SocketStream
{
public static WebSocket ws;
private static List<string> serverMsg = new List<string>();
public static void initializeSocket()
{
ws = new WebSocket("ws://Some IP:8080/human-collaborator/data");
Debug.WriteLine("****** INITIALIZED SOCKET (should happen only once) *****");
Task.Run(() => startSocketStream());
}
private static void startSocketStream()
{
int attempts = 0;
while (!ws.IsAlive)
{
try
{
attempts++;
ws.Connect();
}
catch (WebSocketException)
{
Debug.WriteLine("Connection attempts: " + attempts.ToString());
}
}
ws.OnOpen += (sender, args) =>
{
Debug.WriteLine("# SOCKET OPENED");
};
ws.OnError += (sender, args) =>
{
Debug.WriteLine("# SOME ERROR OCCURED");
};
ws.OnClose += (sender, args) =>
{
Debug.WriteLine("# SOCKET CLOSED");
};
}
}
我正在调用 Global.asx 中的 initializeSocket() 方法以在应用程序级别运行它
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
SocketStream.initializeSocket();
}
}
我的 HumanCollaboratorDialog 类如下:
[Serializable]
public class HumanCollaboratorDialog : IDialog<object>
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(this.MessageReceivedAsync);
}
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
SocketStream.ws.OnMessage += async (sender, e) =>
{
try
{
await context.PostAsync(e.Data);
}
catch (HttpRequestException ex)
{
throw ex;
}
};
Thread.Sleep(500);
string output = message.Text;
SocketStream.ws.Send(output);
Thread.Sleep(500);
context.Wait(MessageReceivedAsync);
}
}
我的 MessagesController 有以下 POST 方法:
public virtual async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type == ActivityTypes.Message)
{
await Conversation.SendAsync(activity, () => new HumanCollaboratorDialog());
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
e.Data 和 context 都不是空的。我认为问题出在套接字连接上,或者可能是我在 SocketStream 类中做错了什么。以下是图片
【问题讨论】:
-
我不知道你为什么要在 Web API 中运行一个套接字...
-
@EzequielJadib 我想在后台连续运行套接字,这样如果服务器发生变化,它可以通知机器人。在这种情况下,更好的解决方案是什么?
-
在旁注中,不要做
catch(Exception ex){ throw ex; }。 It's evil -
那么在异常发生时什么是 null 呢?上下文? e 参数?
-
@EzequielJadib,没有一个。第一条消息很好,但之后它不起作用并引发异常。
标签: c# .net sockets botframework websocket-sharp