繁体   English   中英

C#使HttpWebResponse等待直到收到响应,而不是收到HTTP 400错误

[英]C# Make HttpWebResponse wait until response has been received instead of receiving HTTP 400 Error

我正在尝试使用其API访问Adobe的Datawarehouse报告。 它的工作方式是,首先使用可用的指标和您希望降低的维度来形成JSON。 一切正常。 但是,问题出在这里。 每当我请求超过3到4个维度时,生成报告的时间就会更长。 我需要HttpWebResponse等待它完成,然后再移动到下一行。 以下是我根据github上的示例构建的示例代码。

class Program 
{

    protected static string JSONFolder = System.Configuration.ConfigurationManager.AppSettings["JSONFolder"];
    protected static string USERNAME = System.Configuration.ConfigurationManager.AppSettings["Username"];
    protected static string SECRET = System.Configuration.ConfigurationManager.AppSettings["Secret"];
    protected static string ReportSuiteID = System.Configuration.ConfigurationManager.AppSettings["ReportSuiteID"];
    private static string ENDPOINT = "https://api5.omniture.com/admin/1.4/rest/";
    protected static string environment = "dev"; 

    static void Main(string[] args)
    {
        DateTime previousDay = DateTime.Today.AddDays(-1);
        string json = RequestJsonBuilder(previousDay, previousDay, ReportSuiteID);
        string response = callMethod("Report.Queue", json, 15);

        var jss = new JavaScriptSerializer();
        var requestDetails = jss.Deserialize<Dictionary<string, string>>(response);
    }

    /*Build the json for the methods Report.GetStatus and Report.Get*/
    public static string RequestJsonBuilderStatus(string id)
    {
        ReportID json = new ReportID() { reportID = id };

        var serializer = new JavaScriptSerializer();
        var serializedResult = serializer.Serialize(json);
        return serializedResult;
    }

    /*Build the json for the method Report.Queue*/
    static string RequestJsonBuilder(DateTime StartDate, DateTime EndDate, string ReportSuiteID)
    {
        //Build the list of metrics to send with the request
        var listMetrics = new List<Metrics>();
        listMetrics.Add(new Metrics() { id = "visits" });


        //Build the list of elements to send with the request
        var listElements = new List<Elements>();
        listElements.Add(new Elements() { id = "page" , top = "25"});

        var serializer2 = new JavaScriptSerializer();
        Dictionary<string, RankedRequest> dic = new Dictionary<string, RankedRequest>();
        dic.Add("reportDescription", new RankedRequest()
        {
            reportSuiteID = ReportSuiteID,
            dateFrom = StartDate.ToString("yyyy-MM-dd"),
            dateTo = EndDate.ToString("yyyy-MM-dd"),
            metrics = listMetrics,
            elements = listElements,
            source = "warehouse"

        });
        var serializedResult2 = serializer2.Serialize(dic);
        return serializedResult2;
    }

    /*Build the rest call to the Adobe Analytics REST APII 1.4*/
    public static String callMethod(String method, String data, int secs)
    {
        Program prog = new Program();
        HttpWebResponse statusResponse = null;
        string responseXml = "";
        StringBuilder sbUrl = new StringBuilder(ENDPOINT + "?method=" + method);
        HttpWebRequest omniRequest = (HttpWebRequest)WebRequest.Create(sbUrl.ToString());
        string timecreated = generateTimestamp();
        string nonce = generateNonce();
        string digest = getBase64Digest(nonce + timecreated + SECRET);
        nonce = base64Encode(nonce);
        omniRequest.Headers.Add("X-WSSE: UsernameToken Username=\"" + USERNAME + "\", PasswordDigest=\"" + digest + "\", Nonce=\"" + nonce + "\", Created=\"" + timecreated + "\"");
        omniRequest.Method = "POST";
        omniRequest.ContentType = "text/json";

        //Write the json details to the request
        using (var streamWriter = new StreamWriter(omniRequest.GetRequestStream()))
        {
            string json = data;
            Console.WriteLine("\n 2.0 ############## Json request : \n\n " + json + "\n\n");
            streamWriter.Write(json);
        }

        //Get the response of the request
        try
        {
            Console.WriteLine("\n 2.0 ############## Sleeping thread for " + secs + "\n");

            using (HttpWebResponse statusResponse = (HttpWebResponse) omniRequest.GetResponse())
            {
                using (Stream receiveStream = statusResponse.GetResponseStream())
                {
                    using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
                    {
                        responseXml = readStream.ReadToEnd();
                        return responseXml;
                    }
                }
            }
        }
        catch (Exception ex) { throw ex; }
    }

    // other methods defined below
    // private static string getBase64Digest(string input)
    // private static string generateNonce()
    // public static string base64Encode(string data)
    // etc.
}

如何使HttpWebResponse等待实际收到HTTP 200响应。 根据我添加的指标和维度的数量,这可能需要几分钟到一个小时的时间。

我尝试过的事情还包括将第88行更改为以下内容:

.NET引发WebException((400)错误请求)时,如何处理WebResponse?

如何等待直到带有HttpWebRequest的Web请求完成?

衷心感谢您在这里的所有帮助。

谢谢

您是否尝试设置超时时间? 我最近在寻找类似的问题,发现一个:

HttpWebRequest.GetResponse()不断超时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM