asp.net中后台如何请求一个网址获取响应流

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net中后台如何请求一个网址获取响应流相关的知识,希望对你有一定的参考价值。

在asp.net中,我已近有了一个带参数的网址,就是一个接口。比如说www.baidu.com/aaa/aa.php?uid=XXX.你在网址上复制这个地址,网页会显示一个值。我想在后台来请求这个网址,然后获取响应流来对返回值进行处理。具体代码是什么?

System.Net.WebClient web = new System.Net.WebClient();
string result = web.DownloadString(url); web.DownloadString(url)
参考技术A HttpWebRequest request = (HttpWebRequest)WebRequest.Create("地址");
request.Method = "GET";

using (WebResponse response = request.GetResponse())

    using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
    
        //reader就是你要的流
        //return reader.ReadToEnd();
    

追问

比如说一个地址打开后,网页显示一个字符串,比如wuqh.那么我该如何得到这个字符串啊?还有这个StreamReader的命名空间是什么啊?我已经引用了system.Net了

追答reader.ReadToEnd();已经把整个页面都得到了。然后你可以通过编写正则来匹配你要的东西。

你想单独得到这个字符串,是不可能的。只能得到网页的所有信息,然后从中筛选。

追问

这个借口就两种情况,要么有值,要么没值。有值我是这么写的
if(reader.ReadToEnd().Trim().Length>0)
这么写对么?还有我测试端口时,返回的是wuhq.但是reader.readToEnd().Tostring()并没有这个字符串啊。

追答

你这个wuqi是后来输入的,并不是网页html代码中的一部分?

如果是后来输入的,是得不到了。那么你得到网页请求的流,就毫无意义了。因为网页的请求流中的数据都是网页本身的信息。后来输入的信息是得不到的。

追问

那么后来输入的又该用什么方法得到呢?
public void WriteJsonEnd(object obj)

Response.Clear();
Response.Write(JsonConvert.SerializeObject(obj));
Response.End();

这个是接口的部分代码。

追答

刚才我本地试了一下写的代码。


是可以实现你现在所说的功能的。


using System.IO;


我新建了一个aspx页面

    //aspx页面代码
    protected void Page_Load(object sender, EventArgs e)
    
if (!Page.IsPostBack)

Response.Clear();
Response.Write("123");
Response.End();

    

控制台中的代码

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:5983/Default.aspx");
request.Method = "GET";

using (WebResponse response = request.GetResponse())

using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))

string message = reader.ReadToEnd();

using (StreamWriter sw = new StreamWriter(@"d:\\text.txt"))

sw.WriteLine(message);


D盘下会出现一个text.txt文件,里面的内容就是123

参考技术B private string GetHtml(string URL)

string responseFromServer = "";

WebRequest request = WebRequest.Create(URL);
request.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
responseFromServer = reader.ReadToEnd();
reader.Close();
dataStream.Close();
response.Close();

return responseFromServer;

如何继续等待 API 请求响应值完成 ASP .Net Core MVC

【中文标题】如何继续等待 API 请求响应值完成 ASP .Net Core MVC【英文标题】:How to keep waiting for API request response value complete ASP .Net Core MVC 【发布时间】:2020-12-29 08:32:01 【问题描述】:

我有一个使用 Azure 服务管理 API 的带有多个外部 api 请求的 asp .net core mvc 应用程序。 https://docs.microsoft.com/en-us/rest/api/resources/providers/register#code-try-0 从此 api 请求注册任何命名空间。但它有更多的时间来完成。最初,它的响应 json 属性值为“未注册”,在上述 POST 请求发送其值设置为“注册”之后。它需要 2 到 3 分钟才能完成。最后将响应值设置为“已注册”。

HttpClient client = new HttpClient();
HttpRequestMessage request2 = new HttpRequestMessage(HttpMethod.Post, String.Format(Constants.MicrosoftManagedProviderRegisterApi, subscription));
                    request2.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);

                    // Ensure a successful response
                    HttpResponseMessage response2 = await client.SendAsync(request2);
                    response2.EnsureSuccessStatusCode();

这就是我发送 API 请求的方式。我想知道我应该如何在控制器内部等待,直到响应 json 属性值设置为“已注册”。有什么简单的方法可以实现吗?

请参考下面的回复类型。


  "id": "/subscriptions/***/providers/Microsoft.ManagedServices",
  "namespace": "Microsoft.ManagedServices",
  "authorization": "",
  "resourceTypes": [],
  "registrationState": "Unregistered",
  "registrationPolicy": "RegistrationRequired"



      "id": "/subscriptions/***/providers/Microsoft.ManagedServices",
      "namespace": "Microsoft.ManagedServices",
      "authorization": "",
      "resourceTypes": [],
      "registrationState": "Registering",
      "registrationPolicy": "RegistrationRequired"



      "id": "/subscriptions/***/providers/Microsoft.ManagedServices",
      "namespace": "Microsoft.ManagedServices",
      "authorization": "",
      "resourceTypes": [],
      "registrationState": "Registered",
      "registrationPolicy": "RegistrationRequired"

【问题讨论】:

读取响应消息,如果不等于“已注册”则再次调用。带有 loopif 语句和在下次调用 api 之前稍等片刻以防止节流,听起来就像你所需要的。 "我想知道我应该如何一直在控制器内部等待,直到响应 json 属性值设置为 'Registered'" - 你根本不应该(在控制器中等待几分钟到几小时的事情是一个坏主意)...但是由于它不是您正在寻找的答案,因此我不会将其作为答案发布 为什么要等待答案? 在上述请求之后,我还有另一个 API 请求要完成。需要高于一个值的下一个 API 请求应“已注册”。这就是为什么我需要等待。整个过程可以使用 Azure power-shell 完成。它也在等待那段时间。 我知道这不是好的做法。但要求就是这样。 @Ryan 我可以在这里使用 while 循环吗? 【参考方案1】:

HttpClient 有一个名为Timeout 的属性,默认设置为100 秒,使用这个:

client.Timeout = TimeSpan.FromMinutes(4);

【讨论】:

它没有超时。响应码在其值更改为注册时是可以的。【参考方案2】:

正如上面的 cmets 所述,在控制器中等待这么长时间是个坏主意。但是,由于要求是等待那么长时间,我将提供一个实现此的逻辑:

HttpClient client = new HttpClient();
HttpRequestMessage request2 = new HttpRequestMessage(HttpMethod.Post, String.Format(Constants.MicrosoftManagedProviderRegisterApi, subscription));
                    request2.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);

HttpResponseMessage response2 = null;
            while (!IsRegistered(response2))
            
                response2 = await client.SendAsync(request2).ConfigureAwait(false);
            

IsRegistered 方法逻辑(添加更多检查):

private Task<bool> IsRegistered(HttpResponseMessage response)
    
        if (response != null)
        
            var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            if (!string.IsNullOrWhiteSpace(result))
            
                serviceResponse = this.serializer.Deserialize<ServiceResponseSchema>(result);
                if (string.Compare(serviceResponse.RegistrationState, "Registered") == 0)
                
                    return true;
                
            
        

        return false;
    

我的理解是,您一直在点击 url,直到获得所需的响应。如果我的理解有误,请告诉我。

【讨论】:

.EnsureSuccessStatusCode() 在“注册”状态下设置为 true。我需要一直等到它的响应 json 属性值“已注册”。我将更新上述问题区域中的响应值 它是来自'System.Net.Http.Headers'的预配置方法,对吗?当“已注册”状态时,我应该如何将其更改为返回 true?请给我建议 我已经更新了我的答案,请检查。我以为你有自己的方法。 创建一个新动作来检查状态并返回它,从客户端循环调用该 API。将循环推送到浏览器,在那里您没有相同的超时问题。否则,我建议使用 Web 套接字或服务器发送的事件。 非常感谢。我会试试这个

以上是关于asp.net中后台如何请求一个网址获取响应流的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 中间件中直接将响应正文设置为文件流?

asp.net 如何点击一个div响应后台的事件,就是执行的是后台的代码

asp.net获取当前网址url

如何在 ASP.NET MVC 操作中获取引荐来源网址?

asp.net,我想做一个企业网址,别人提供了HTML页面,但是我怎么把数据绑定在html里面把数据展示给别人看

从跨域 http.get 请求的 ASP.NET Web API 2 响应中获取 Angular 中的特定响应标头(例如 Content-Disposition)