【发布时间】:2020-04-02 07:12:20
【问题描述】:
我正在尝试使用 GitHub 上的示例获取推文,但我收到错误“底层连接已关闭:提交时发生意外错误”。我无法理解。起初,我在 Twitter 上创建了应用程序,并将 Twitter 生成的密钥添加到应用程序中。我对 2 个属性有疑问,我不知道它们将用于什么,也不知道它们是否会导致问题:
1 - 网站 URL - 我在 Wix 上创建了一个网站来填写此字段,但我不明白它的用途,因为我只想在桌面应用程序中阅读推文。
2 - 回调 URL - 最初我没有放任何东西,然后我在帖子中看到要放 http://127.0.0.1/ 我用这些信息运行应用程序,但我还是不知道它是做什么用的,因为我要从桌面应用程序中获取推文。
这是使用的代码和收到的错误!
using System;
using System.Linq;
using System.Threading.Tasks;
using LinqToTwitter;
namespace ConsoleApplication3
{
class Program
{
static void Main()
{
MainAsync().Wait();
}
static async Task MainAsync()
{
var auth = new SingleUserAuthorizer
{
CredentialStore = new InMemoryCredentialStore()
{
ConsumerKey = "MyConsumerKey",
ConsumerSecret = "MyConsumerSecret",
OAuthToken = "MYOAuthToken",
OAuthTokenSecret = "MYOAuthTokenSecret"
}
};
var twitterCtx = new TwitterContext(auth);
var searchResponse = await (from search in twitterCtx.Search
where search.Type == SearchType.Search
&& search.Query == "flamengo"
select search).SingleOrDefaultAsync();
if (searchResponse != null && searchResponse.Statuses != null)
searchResponse.Statuses.ForEach(tweet =>
Console.WriteLine(
"User: {0}, Tweet: {1}",
tweet.User.ScreenNameResponse,
tweet.Text));
}
}
}
System.AggregateException was unhandled
HResult=-2146233088
Message=Um ou mais erros.
Source=mscorlib
StackTrace:
em System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
em System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
em System.Threading.Tasks.Task.Wait()
em ConsoleApplication3.Program.Main() na C:\Danilo\Docs\Visual Studio 2015\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs:linha 12
em System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
em System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
em System.Threading.ThreadHelper.ThreadStart_Context(Object state)
em System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
em System.Threading.ThreadHelper.ThreadStart()
InnerException:
HResult=-2146233088
Message=Ocorreu um erro ao enviar a solicitação.
Source=mscorlib
StackTrace:
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em LinqToTwitter.Net.GetMessageHandler.<SendAsync>d__4.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em LinqToTwitter.TwitterExecute.<QueryTwitterAsync>d__48 1.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em LinqToTwitter.TwitterContext.<ExecuteAsync>d__136 1.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em LinqToTwitter.TwitterQueryProvider.<ExecuteAsync>d__8 1.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em LinqToTwitter.TwitterExtensions.<SingleOrDefaultAsync>d__5 1.MoveNext()
--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
em System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
em ConsoleApplication3.Program.<MainAsync>d__1.MoveNext() na C:\Danilo\Docs\Visual Studio 2015\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs:linha 29
InnerException:
HResult=-2146233079
Message=A conexão subjacente estava fechada: Erro inesperado em um envio.
Source=System
StackTrace:
em System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
em System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
InnerException:
HResult=-2146232800
Message=Não é possível ler os dados da conexão de transporte: Foi forçado o cancelamento de uma conexão existente pelo host remoto.
Source=System
StackTrace:
em System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)
em System.Net.PooledStream.EndWrite(IAsyncResult asyncResult)
em System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
InnerException:
ErrorCode=10054
HResult=-2147467259
Message=Foi forçado o cancelamento de uma conexão existente pelo host remoto
NativeErrorCode=10054
Source=System
StackTrace:
em System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
em System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
InnerException:
【问题讨论】:
-
您的代码对我有用,但我无法重现该问题。查看最里面的异常,我确实看到了错误代码 #10054 - 可能表明它与您的网络有关。您的回调 URL 与我的匹配。我的应用程序权限设置为读取、写入和 DM,但我认为这对于搜索并不重要。也许尝试向 RequestToken 端点 (developer.twitter.com/en/docs/basics/authentication/…) 发出原始的 .NET HttpClient 请求,看看是否遇到相同的错误。
-
谢谢,我改了权限,因为我没有DM权限,现在是读,写,私信我又测试了一遍,做debug,同样的问题。如果我理解正确,在我运行 var auth = new SingleUserAuthorizer {...} 之后,我是否已经获得了 twitter 的授权来进行研究,对吗?有什么地方可以查看 auth 变量或 twitterCtx 以确保授权正常吗?错误只发生在搜索的时候,不知道是不是以前的非授权造成的。
-
您可以使用 Fiddler 来观察流量并查看哪个调用返回了错误。我的想法是,与 Twitter 通信可能存在一些问题,看看对 Twitter API 的 any HTTP 调用是否有效可能会很有趣。如果您怀疑杀毒软件有问题,您可以通过关闭杀毒软件并再次运行代码来发现。
-
您可以使用 Fiddler (telerik.com/fiddler),它是免费下载的,可让您查看 HTTP 流量。它可能会提供有关问题所在的更多详细信息。
-
正确 - 授权通常是第一个障碍,这就是常见问题解答的 401 部分如此之长的原因。大多数请求来自跟踪浏览器和/或应用程序中的流量。您可以通过关闭浏览器或其他任何可能访问 Internet 的设备来最小化 Fiddler 流量。