Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#websocket客户端无法连接到服务结构服务_C#_Websocket_Azure Service Fabric - Fatal编程技术网

c#websocket客户端无法连接到服务结构服务

c#websocket客户端无法连接到服务结构服务,c#,websocket,azure-service-fabric,C#,Websocket,Azure Service Fabric,我有一个作为api网关的无状态服务,以及一个部署到安全服务结构集群(使用Azure AD)上Azure的有状态服务。我正在公开一个websocket端点(wss)。当从我的客户端应用程序(使用ClientWebSocket实例的控制台应用程序)连接时,我得到“无法连接到远程服务器”,内部异常声明:“身份验证失败,因为远程方已关闭传输流。”如果我附加SSL证书(从我的本地计算机)就会发生这种情况群集是否受保护,或者是否在创建ClientWebsocket对象时将我的网络凭据与它一起传递。我遇到的端

我有一个作为api网关的无状态服务,以及一个部署到安全服务结构集群(使用Azure AD)上Azure的有状态服务。我正在公开一个websocket端点(wss)。当从我的客户端应用程序(使用ClientWebSocket实例的控制台应用程序)连接时,我得到“无法连接到远程服务器”,内部异常声明:“身份验证失败,因为远程方已关闭传输流。”如果我附加SSL证书(从我的本地计算机)就会发生这种情况群集是否受保护,或者是否在创建ClientWebsocket对象时将我的网络凭据与它一起传递。我遇到的端点如下所示:wss://blahblahblah.cloudapp.azure.com:19000/mygateway/data. 当我在保护代码之前在本地测试它时,我能够连接。一旦我成功将其部署到安全群集,我的客户端应用程序将无法连接。我是否需要从客户端提供其他东西来通过安全检查

public async Task<bool> ConnectAsync(Uri serviceAddress)
    {
        this._clientWebSocket = new ClientWebSocket();

        using (CancellationTokenSource tcs = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
        {
            try
            {
                _clientWebSocket.Options.ClientCertificates = GetCertForRemoteAuthentication();
                _clientWebSocket.Options.Credentials = new NetworkCredential{Domain = "mydomain", Password = "somepassword", UserName = "username"};

                await this._clientWebSocket.ConnectAsync(serviceAddress, tcs.Token);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }


        }


        return true;
    }
公共异步任务ConnectAsync(Uri serviceAddress) { 这是._clientWebSocket=new clientWebSocket(); 使用(CancellationTokenSource tcs=新的CancellationTokenSource(TimeSpan.FromSeconds(5))) { 尝试 { _clientWebSocket.Options.ClientCertificates=GetCertForRemoteAuthentication(); _clientWebSocket.Options.Credentials=newnetworkcredential{Domain=“mydomain”,Password=“somepassword”,UserName=“UserName”}; 等待此消息。\u clientWebSocket.ConnectAsync(serviceAddress,tcs.Token); } 捕获(例外e) { 控制台写入线(e); 投掷; } } 返回true; }
通过指定一个特定端口并点击有状态服务的endoint,而不是我们的service fabric应用程序端点(在端口19000上),我们能够访问我们的服务。还必须在服务器代码上添加一些代码,以确保将服务器证书绑定到服务器端的websocket侦听器。这就解决了我们的问题。

我怀疑,一旦您连接,cookies就建立起来了。我会尝试从IE历史记录中删除cookies,然后重试。我还将使用诸如wireshark或fiddler之类的嗅探器捕获结果,这样您就可以让代码在使用和不使用cookie的情况下都能正常工作。您使用的凭据是否与建立初始连接时使用的凭据相同。Cookie和特定用户之间可能存在关联。在安全保护之前,我没有专门传递任何凭据。我将看一看Fiddler,看看它向我展示了什么。将我的客户端证书指纹添加到我的SF群集,认为这就是问题所在,但没有解决它。Fiddler目前没有告诉我太多-我看不出Fiddler中的连接尝试在哪里,但我可能没有在那里设置什么。我确实看到Fiddler中有一个到我的service fabric应用程序的隧道,但它出于某种原因使用http-而不是https或wss。不知道为什么我会在fiddler中看到。在fiddler中找到日志。与blahblahblah.cloudapp.azure.com(for#33)的HTTPS握手失败。System.IO.IOException身份验证失败,因为远程方已关闭传输流。