我实际上如何从方法外部获取异步 Web 请求的响应?

2024-02-21

我有点困惑。我正在尝试以异步方式发布到我的网络服务,理想情况下我想启动请求,在 UI 上显示加载微调器,然后当异步请求完成时处理响应,并且如果有错误则显示错误,或对结果进行其他操作。

这是我的代码,我在这里调用请求并传递一些数据。

private void SignInExecute()
{

        if (Username == null || Password == null)
        {
            LoginOutput = "Please provide a username or password.";
        }
        else
        {
            this.webService.SendLoginRequest("http://localhost:3000/client_sessions", "username=" + Username + "&password=" + Password);

        }

}

这是实际的网络请求代码:

public void SendLoginRequest(string url, string postdata)
{
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

        request.Method = "POST";

        request.ContentType = "application/x-www-form-urlencoded";

        request.Accept = "application/json";

        byte[] byteArray = Encoding.UTF8.GetBytes(postdata);

        request.CookieContainer = new CookieContainer();

        request.ContentLength = byteArray.Length;

        Stream dataStream = request.GetRequestStream();

        dataStream.Write(byteArray, 0, byteArray.Length);

        dataStream.Close();

        ((HttpWebRequest)request).KeepAlive = false;

        request.BeginGetResponse(new AsyncCallback(GetLoginResponseCallback), request);


    }

    private static void GetLoginResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        HttpWebResponse response =  (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd();

        Console.WriteLine(responseString);

        // Close the stream object
        streamResponse.Close();
        streamRead.Close();
        response.Close();
    }

所以总结一下。我希望能够将响应返回到最初调用 Web 请求启动的对象。有什么帮助吗?


你需要告诉BeginGetResponse返回到通过以下方式调用它的相同上下文SynchronizationContext.Current。像这样的东西(代码没有适当的错误检查,所以你应该正确地考虑这一点)(此外,Platinum Azure 是正确的,你应该使用using让您的流正确关闭(并保证):

在您的 SendLoginRequest 中:

//Box your object state with the current thread context
object[] boxedItems = new []{request, SynchronizationContext.Current};
request.BeginGetResponse(new AsyncCallback(GetLoginResponseCallback), 
    boxedItems);

获取响应代码:

private static void GetLoginResponseCallback(IAsyncResult asynchronousResult)
{
//MY UPDATE 
    //Unbox your object state with the current thread context
    object[] boxedItems = asynchronousResult.AsyncState as object[];
    HttpWebRequest request = boxedItems[0] as HttpWebRequest;
    SynchronizationContext context = boxedItems[1] as SynchronizationContext;

    // End the operation
    using(HttpWebResponse response =  
        (HttpWebResponse)request.EndGetResponse(asynchronousResult))
    {
        using(Stream streamResponse = response.GetResponseStream())
        {
            using(StreamReader streamRead = new StreamReader(streamResponse))
            {
                string responseString = streamRead.ReadToEnd();

                Console.WriteLine(responseString);
//MY UPDATE
                //Make an asynchronous call back onto the main UI thread 
                //(context.Send for a synchronous call)
                //Pass responseString as your method parameter 
                //If you have more than one object, you will have to box again
                context.Post(UIMethodToCall, responseString);
            }
        }
    }
}

实现您的 UI 处理

public static void UIMethodCall(object ObjectState)
{
    String response = ObjectState as String;
    label1.Text = String.Format("Output: {0}", response);
    //Or whatever you need to do in the UI...
}

不过,现在我会先测试一下。我对 Microsoft 事件驱动异步实现的理解是,响应是上下文感知的,并且知道要返回哪个上下文。因此,在假设您不在同一上下文中之前,请尝试更新 UI 进行测试(如果您不在调用 (UI) 线程上,这将导致线程上下文异常)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我实际上如何从方法外部获取异步 Web 请求的响应? 的相关文章

  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • vs2008 c#:Facebook.rest.api如何使用它来获取好友列表?

    如何在此基础上取得进一步的进步 获取好友列表的下一步是什么 string APIKey ConfigurationManager AppSettings API Key string APISecret ConfigurationManag
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • 错误:包 javax.servlet 不存在

    我试图按照以下指南在我的 Web 应用程序中使用 jsf 2 实现登录过滤器 https stackoverflow com tags servlet filters info https stackoverflow com tags se
  • Java 字符串用“.”分割(点)[重复]

    这个问题在这里已经有答案了 为什么这段代码的第二行会抛出ArrayIndexOutOfBoundsException String filename D some folder 001 docx String extensionRemove
  • 如何登录? Django TastyPie 与 ApiKeyAuthentication 实际认证流程

    我有一个 Adob e Air 移动应用程序 可以通过 TastyPie 与 Django 进行通信 要使用该应用程序 人们必须先注册 因此他们必须提供他们的电子邮件和密码 之后他们将能够 登录 我认为最好的主意是 在输入成功的用户名 密码
  • 快速构建 error_if_any_output_files_are_specified_they_all_must_be

    当转换为在 Xcode 10 上使用新的构建系统时 我的几个扩展目标的输出中出现以下错误
  • 如何计算SQL Server 2008中记录之间的时间

    对于 sql 2008 中的审计表 我需要计算每个订单在给定步骤中的时间 表示为新列 Old New Time Entered Order Number NULL Step 1 4 30 12 10 43 1C2014A Step 1 St
  • 为什么 0 除以 0 会出错?

    我在代码中进行的计算中遇到了这个问题 如果除数也为 0 则除数为 0 在我的代码中 对于这种情况我返回 0 我想知道 虽然除以零通常是未定义的 但为什么不为这种情况破例呢 我的理解为什么除以零是未定义的基本上是它不能逆转 然而 我在 0 0
  • 在 asp.net 中不使用 ScriptManager 从 JavaScript 调用 WebServices

    我已经为我的 Asp net 项目创建了一个 Web 服务 目前我正在通过引用中的服务从 JavaScript 访问该服务ScriptManager 但我不想添加ScriptManager这样我就可以在任何 HTML 页面中使用它 好的 因
  • 雪花 - 横向不能位于连接的左侧

    我有一个变体数据类型 我正在对其执行横向展平 但随后我需要左连接其中一个 json 元素 以从 Snowflake 中的另一个关系表中查找相应 ID 的值 当我这样做时 它会给我错误 横向视图不能位于连接的左侧 这是没有意义的 因为如果我不
  • 在 varchar 字段而不是数字字段上使用 BETWEEN ?

    我正在使用 ColdFusion 8 和 SQL Server 2008 R2 我正在尝试查询一列值以获取值在一定范围内的行 该列应该是数字 但事实并非如此 它被设置为 varchar 由其他人 有 100 000 多行数据 这是数据的假样
  • 使用正则表达式删除脚本标签

    我正在尝试使用我在该网站中找到的正则表达式 但它似乎不起作用 有任何想法吗 输入字符串 sFetch 123456 Regex sFetch Regex Replace sFetch
  • 将存储为文本数据类型的数字转换为 int

    我有一个导入结果的数据库 数据库是可交付的 我没有自己进行导入 也无法访问原始数据来自己进行导入 也就是说 有一个整数值被导入到文本数据类型中 所有存储的值都是有效整数 我不断得到 Explicit conversion from data
  • Ionic 3 - 键盘无缘无故地将内容向上推,并超越其他内容

    我正在 Ionic 中开发一个简单的应用程序 我有一个问题 键盘将我的输入字段向上推到另一个 div 上 而键盘有足够的空间 我该如何解决 我已经在互联网上浏览过 但无法找到解决我的问题的任何方法 发生的情况是这样的 正如您所看到的 文本在
  • 来自 POST 的 res.redirect

    由于某种原因 登录完成后我无法重定向到 blog 在我的登录控制器中 我有以下内容 module exports post function req res var login req body login if login req bod
  • sudo: python: 找不到命令

    我要实现sudo python找到Python 3 我遇到了一个奇怪的问题 在终端中输入python version给了 3 6 但是sudo python version给了2 7 经过尝试一些事情后我终于卸载了 2 7sudo apt
  • jQuery 用于获取表行上的 Click 事件

    我有下表 table tr class rows td cell1 td td cell2 td tr table 如果我点击了 如何设置警报消息any of the column of 使用jquery 您可以使用委托来获得更好的性能 它
  • JavaScript 中这个东西是什么?

    考虑 var something wtf null omg null 自从我上次使用 JavaScript 编程以来 我的 JavaScript 知识仍然非常零碎 但我想我现在已经重新学习了大部分知识 除了这个 我不记得以前见过这个 它是什
  • 如何映射对象的键以使 JSON 更容易在 React 中处理

    如果我有这个 JSON name Active user config status active name Paused user config status active 然后我可以渲染一个 React 组件并轻松访问数据 render
  • jenkins pipelines:shell脚本无法获取更新的环境变量

    在 Jenkins 中 我想获取用户输入并传递给 shell 脚本以供进一步使用 我尝试设置为环境变量 但shell脚本无法获取最新值 旧值是echo pipeline agent none environment myVar someth
  • Rails 中按月和年对记录进行分组

    我使用的是 Ruby 1 9 2 Rails 3 0 x 并且使用 MySQL DB 我有一个消息模型 每天都可以发布新消息 我有一个索引操作 我想在其中显示按月份和年份分组的这些消息 这主要用于过滤消息 我的查询如下所示 active m
  • 我实际上如何从方法外部获取异步 Web 请求的响应?

    我有点困惑 我正在尝试以异步方式发布到我的网络服务 理想情况下我想启动请求 在 UI 上显示加载微调器 然后当异步请求完成时处理响应 并且如果有错误则显示错误 或对结果进行其他操作 这是我的代码 我在这里调用请求并传递一些数据 privat