【问题标题】:using httpclient in asmx webmethod在 asmx webmethod 中使用 httpclient
【发布时间】:2018-03-04 06:10:45
【问题描述】:

是否可以使用 httpclient 在 ASMX WebMethod 中调用 REST 服务? httpclient 库是异步的,因为 asmx 不支持异步等待(TAP),所以我使用 .Result 来强制调用同步。但是,这次 httpclient 无法成功调用,我得到远程服务器主动拒绝连接错误。如果我使用 async await 或 .Result 在 win forms 应用程序中运行相同的代码,它可以正常工作。

这是 ASMX WebMethod 的问题吗?

[WebMethod]
public void Get(){

   //Sample (off the top of my head)
   HttpClient client = new HttpClient();
   //more code
   Task.Run(()=> client.GetDocument()).Result;

}

谢谢

【问题讨论】:

  • HttpClient 客户端 = new HttpClient(); var tt = Task.Run(() => client.GetAsync("immanuel.co")).Result; -- 变量 tt 现在包含响应及其完全同步
  • @Immanuel,您在 Asp.Net 中做了两件不应该做的事情 - .ResultTask.Run()Don't block on async code

标签: c# web-services asynchronous asmx


【解决方案1】:

您可以在管道中注入一个模块来处理处理,而不是实际的 .asmx 代码。但我建议在麻烦之前使用HttpWebRequest

不要做.Result。不要在 Asp.Net 上下文中使用Task.Run()

模块:

public class Proxy : IHttpModule
{
    public void Init(HttpApplication context)
    {
        var wrapper = new EventHandlerTaskAsyncHelper(DoAsyncWork);
        context.AddOnBeginRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler);
    }

    async Task DoAsyncWork(object sender, EventArgs e)
    {
        // await... anything
    }
}

【讨论】:

  • 感谢您的回复。如何在 asmx webmethod 中使用这个类?
  • 您在 web.config 或 IIS 中注册模块。在代码中,您必须检查请求是否针对您的网络服务,如果是,请执行您的操作。否则跳出来让asp管道继续。使用模块有很多资源,但除非你真的需要异步来实现可扩展性,否则我仍然建议你使用同步 HttpWebRequest
  • 我明白了。非常感谢您回答我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多