using HttpWebRequest/HttpWebResponse to generate webrequest

Hi all,

I am trying to use HttpWebRequest/HttpWebResponse  to generate a report on the webserver...once the report is generated , I wanted to display the output.

I am not sure how to use the HttpWebResponse to wait for the report generation to complete and then call the generated report.




varReportURL = "http://abc/acweb/abc/PPM.rox?Submit&__scheduleType=sync&__overwrite=new&__outputname=/StrategicPolicyAnalysis/temp.roi&" & Server.UrlEncode(varPARAMETERS) 
 
Dim myReq As HttpWebRequest = HttpWebRequest.Create(varReportURL)
        Dim myResponse As HttpWebResponse = myReq.GetResponse
        Dim m_sPageResponded As String
        m_sPageResponded = myResponse.ResponseUri.ToString()
        'Response.Write(m_sPageResponded)
 
        Dim strm As StreamReader
 
        strm = New StreamReader(myResponse.GetResponseStream(), Encoding.ASCII)
        Dim sLine As String = ""
        While Not IsDBNull(sLine)
            Response.Write(sLine)
            sLine = strm.ReadLine()
            Console.WriteLine(sLine)
        End While
 
 
I was trying something like this but dont think this is correct.
once the report is generated.. I will using a url to display the generated report.
 
varReportURL = "http://abc/acweb/abc/temp.roi?ViewPage&format=pdf&action=view&operation=open"
Response.Write("<script>window.open('" + varReportURL + "','','_target=blank', 'width=1000,height=600');</script>")

Open in new window

sanjaypandeyAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Bob LearnedCommented:
Are you getting a response back from the server with GetResponse?

Bob
0
sanjaypandeyAuthor Commented:
No, though the reports are getting generated on the server..  

I tried displaying something within the loop and outside but nothing get displayed.

Dim myReq As HttpWebRequest = HttpWebRequest.Create(varReportURL)
        Dim myResponse As HttpWebResponse = myReq.GetResponse
        Dim m_sPageResponded As String
        m_sPageResponded = myResponse.ResponseUri.ToString()
        'Response.Write(m_sPageResponded)
 
        Dim strm As StreamReader
 
        strm = New StreamReader(myResponse.GetResponseStream(), Encoding.ASCII)
        Dim sLine As String = "abc"
        Response.Write("test")
        While Not IsDBNull(sLine)
            Response.Write(sLine)
            Response.Write("test")
            sLine = strm.ReadLine()
            Console.WriteLine(sLine)
        End While

Open in new window

0
Bob LearnedCommented:
Are you saying that the GetResponse call freezes, and never returns?  How long does it take to generate a report?

Bob
0
Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

sanjaypandeyAuthor Commented:
just a couple of minutes at the most.
I am not getting any output when using those response.write statement inside  and out of the loop .... but I do see the reports getting generated on the server .

Thanks
0
sanjaypandeyAuthor Commented:
Its definitely freezing, I removed the below code and its responding. Is there a way that I can wait for the time that report is taking to generate and then execute the next line of code that displays the report without  using the StreamReader.



strm = New StreamReader(myResponse.GetResponseStream(), Encoding.ASCII)
        Dim sLine As String = "abc"
        Response.Write("test")
        While Not IsDBNull(sLine)
            Response.Write(sLine)
            Response.Write("test")
            sLine = strm.ReadLine()
            Console.WriteLine(sLine)
        End While
0
Bob LearnedCommented:
The default timeout for the HttpWebRequest is 100000 milliseconds (100 seconds).  If that doesn't cover you requirement, you can raise the TimeOut value to a higher number.

Bob
0
sanjaypandeyAuthor Commented:
No that didnt help.... any other suggestion Please
0
Bob LearnedCommented:
This may be a problem with the way the server expects the request.  What kind of server application are you interfacing with?

Bob
0
sanjaypandeyAuthor Commented:
This is Actuate Reporting server that we use for reporting purpose.

Actuate 8.0
0
Bob LearnedCommented:
Can you see the report in a browser, if you navigate to the same URL that you are using for the HttpWebRequest?

Bob
0
sanjaypandeyAuthor Commented:
Yes, and I can also view the report that get generated every time I run this code.
0
Bob LearnedCommented:
There is an HTTP debugger, called Fiddler, which might help to look at the conversation between the browser and the report server:

Fiddler - Web Debugging Proxy
http://www.fiddlertool.com/fiddler/ 

You need to duplicate the conversation functions that the browser performs.

Bob
0
sanjaypandeyAuthor Commented:
I will give this a try .. thanks
0
sanjaypandeyAuthor Commented:
Here is the piece of code that we have in java .. that uses java side httpresponse and request and works  just fine

If some one can help me convert this to vb.net  .

thanks


/**
   * Method fetchAndReturnFile open a provided url, and 
   * returns the byte stream of that url to the client. The appropriate
   * content type is set first.
   *
   * @param response HttpServletResponse
   * @param servletData FileProxyServletData
   */
  private void fetchAndReturnFile(HttpServletResponse response, FileProxyServletData servletData)
  {
    log.trace (servletData.requestId + ": isIgnoreIOException: " + servletData.isIgnoreIOException);
    
    URL url;
    URLConnection urlConnection;
    String contentType;
    int contentLength;
    byte bytes[] = new byte[LOCAL_BUFFER_SIZE];
    int bytesRead, bytesReadTotal = 0;
    int current;
    InputStream is;
    BufferedInputStream bis;
    OutputStream os;
    long start = 0, end = 0;
    
    try
    {
      response.reset();
      
      /* open url */
      url = new URL(servletData.protocol, servletData.host, servletData.file);
      log.trace (servletData.requestId + ": url: " + url);
      urlConnection = url.openConnection();
      urlConnection.connect();
      
      /* for http, check status */
      int responseCode = HttpServletResponse.SC_OK;
      if (STR_HTTP.equals(servletData.protocol))
      {
        HttpURLConnection httpUrlConnection = (HttpURLConnection) urlConnection;
        responseCode = httpUrlConnection.getResponseCode();
      }
      if (responseCode != HttpServletResponse.SC_OK)
      {
        servletData.isSuccess = false;
        return;
      }
      
      /* set headers */
      if (servletData.type != null)
        contentType = servletData.type;
      else
        contentType = urlConnection.getContentType();
      response.setContentType(contentType);
      log.trace (servletData.requestId + ": contentType: " + contentType);
            
      if (servletData.saveName != null)
        response.setHeader("Content-Disposition", buildContentDispositionHeaderValue(servletData));      
      
      /* prepare reader/writer */
      is = urlConnection.getInputStream();
      bis = new BufferedInputStream(is, servletData.bufferSizeInt);
      os = response.getOutputStream();
      if (servletData.bufferSize != null)
      {
        response.setBufferSize(servletData.bufferSizeInt);
        log.trace (servletData.requestId + ": buffer size: " + servletData.bufferSizeInt);
      }
      log.trace (servletData.requestId + ": is/os: " + is + "/" + os);
 
      /* fetch bytes and send to client */
      boolean isEnd = false;
      bytesRead = 0;
      start = System.currentTimeMillis();
      while (true)
      {
        bytesRead = 0;
        for (int i = 0; i < bytes.length; i++)
        {
          current = bis.read();
          if (current == -1)
          {
            isEnd = true;
            break;
          }
          bytes[i] = (byte) current;
          bytesRead++;
          bytesReadTotal++;
        }
        doWrite(servletData, os, bytes, bytesRead);
        if (isEnd) break;
        if (servletData.isIOExceptionThrown)
        {
          log.trace (servletData.requestId + ": isIOExceptionThrown true");
          servletData.isSuccess = false;
          bis.close();
          return;
        }
      }
      end = System.currentTimeMillis();
      response.setContentLength(bytesReadTotal);
      bis.close();
      log.trace (servletData.requestId + ": before flush");
      doFlush(servletData, os);
      doClose(servletData, os);
      if (servletData.isIOExceptionThrown)
      {
        log.trace (servletData.requestId + ": isIOExceptionThrown true after flush/close");
        servletData.isSuccess = false;
      }
      servletData.elapsed = end - start;
            
      log.trace (servletData.requestId + ": bytesReadTotal: " + bytesReadTotal + ", elapsed: " + servletData.elapsed + "ms");
    }
    catch (MalformedURLException mue)
    {
      log.error (servletData.requestId + ": bad url", mue);
      servletData.isSuccess = false;
    }
    catch (IOException ioe)
    {
      log.error (servletData.requestId + ": bad connection, referer: " + servletData.userAgent, ioe);
      servletData.isSuccess = false;
    }
    catch (Throwable t)
    {
      log.error (servletData.requestId + ": other exception", t);
      servletData.isSuccess = false;
    }
        
  } // fetchAndReturnFile
 
 
 
2. The client need to call that proxy and set up necessary parameters;
 
 protected void processOutData(HttpServletRequest request, HttpServletResponse response, MamsiSession mamsiSession, Properties outData)
  {
    /* session expire checking */
        HttpSession session =  request.getSession(true);
        OnlineUser user = (OnlineUser) request.getAttribute(mamsi.web.filter.Bouncer.SESSION_USER);
        boolean isSessionOk = false;
        boolean isFormValid = true;
        int mode = 0;
 
        String dateFrom = "";
        String dateTo = "";
        String reportName="";
        Properties prop = new Properties();
        Hashtable formStatus = new Hashtable();
 
 
        if (user != null)
        {
            isSessionOk = user.isSessionOK();
        }
        if (! isSessionOk)
        {
             //response.sendRedirect(MamsiServlet.encodeURL(response, URL_REDIRECT));
            mamsiSession.setRedirectUrl(URL_REDIRECT);
            return;
 
        }
 
        /* form validation */
        isFormValid = validateFormValues(outData,formStatus);
        if (DEBUG) trace(TraceLog.TRACE_LEVEL_DEBUG, "ProcessOutData(): wholeFormValid?=" + isFormValid, null);
 
        try{
            if(!isFormValid )
            {
              request.setAttribute(FORM_STATUS,formStatus);
              RequestDispatcher rd;
              rd = getServletContext().getRequestDispatcher(URL_REPORT_INDEX_VIEW);
              rd.forward(request,response);
            }
            else
            {
                 mode = Integer.parseInt(outData.getProperty(ELEMENT_MODE));
                if (DEBUG) trace(TraceLog.TRACE_LEVEL_DEBUG, "ProcessInData(): mode=" + mode, null);
 
                generateDocument(outData);
 
                /* redirect to file proxy */
                String reportFileName = buildReportFileName(this.nameOutput);
 
               session.setAttribute(FileProxyServlet.SESSION_PROTOCOL, PROTOCOL);
               session.setAttribute(FileProxyServlet.SESSION_HOST, HOST);
               session.setAttribute(FileProxyServlet.SESSION_CONTENT_TYPE, CONTENT_TYPE);
               session.setAttribute(FileProxyServlet.SESSION_FILE, reportFileName);
               session.setAttribute(FileProxyServlet.SESSION_ERROR_URL, URL_ERROR) ;
 
 
 
                    if(DEBUG)
                    {
                          trace(TraceLog.TRACE_LEVEL_DEBUG, "processOutData()setAttributeFileProxyServlet:" + FileProxyServlet.SESSION_PROTOCOL + "=" +PROTOCOL,null);
                          trace(TraceLog.TRACE_LEVEL_DEBUG, "processOutData()setAttributeFileProxyServlet:" + FileProxyServlet.SESSION_HOST + "=" +HOST,null);
                          trace(TraceLog.TRACE_LEVEL_DEBUG, "processOutData()setAttributeFileProxyServlet:" + FileProxyServlet.SESSION_CONTENT_TYPE + "=" + "application/pdf",null);
                          trace(TraceLog.TRACE_LEVEL_DEBUG, "processOutData()setAttributeFileProxyServlet:" + FileProxyServlet.SESSION_FILE + "=" + reportFileName,null);
                          trace(TraceLog.TRACE_LEVEL_DEBUG, "processOutData()setAttributeFileProxyServlet:" + FileProxyServlet.SESSION_ERROR_URL + "=" + URL_ERROR,null);
 
                    }
 
                    mamsiSession.setRedirectUrl(URI_FILE_PROXY_SERVLET);
 
            }//end else
        }catch(javax.servlet.ServletException e)
        {
            trace(TraceLog.TRACE_LEVEL_DEBUG, "ProcessOutData():after form validation, exception thrown:" + e, null);
 
        }
        catch(java.io.IOException e)
        {
           trace(TraceLog.TRACE_LEVEL_DEBUG, "ProcessOutData():after form validation, exception thrown:" + e, null);
 
       }
 
  }
 
 
  /**
   * Method generateDocument
   */
  private void generateDocument(Properties prop)
  {
    if (DEBUG) trace(TraceLog.TRACE_LEVEL_DEBUG, "generateDocument(): here", null);
    URL url = null;
    URLConnection urlConnection = null;
    int bytesAvailable, bytesRead = 0;
    Object content;
    String file = buildRequestFilename(prop);
 
    try
    {
      url = new URL(PROTOCOL, HOST, file);
      if (DEBUG) trace(TraceLog.TRACE_LEVEL_DEBUG, "generateDocument(): url: " + url, null);
      urlConnection = url.openConnection();
      urlConnection.connect();
      content = urlConnection.getContent();
      if (DEBUG) trace(TraceLog.TRACE_LEVEL_DEBUG, "generateDocument(): content length: " + urlConnection.getContentLength() + ", content type: " + urlConnection.getContentType(), null);
    }
    catch (MalformedURLException mue)
    {
      trace(TraceLog.TRACE_LEVEL_ERROR, "generateDocument(): bad url", mue);
    }
    catch (IOException ioe)
    {
      trace(TraceLog.TRACE_LEVEL_ERROR, "generateDocument(): bad connection", ioe);
    }
    catch (Exception e)
    {
      trace(TraceLog.TRACE_LEVEL_ERROR, "fetchAndReturnReport(): other exception", e);
    }
 
  } // generateDocument
 
  /**
   * Method buildReportFileName
   */
  private String buildReportFileName(String reportName)
  {
 
    StringBuffer buffer = new StringBuffer();
 
      buffer.append("/acweb/");
      buffer.append(SERVER_NAME);
      buffer.append(reportName);
      buffer.append(".roi?GetReportData&format=PDF");
 
 
    if (DEBUG) trace(TraceLog.TRACE_LEVEL_DEBUG, "buildReportFileName(): " + buffer.toString(), null);
    return buffer.toString();
 
  } // buildReportFileName
 
 
  /**
   * Method buildRequestFilename
   */
  private String buildRequestFilename(Properties prop)
  {
     StringBuffer buffer = new StringBuffer();
     int mode = Integer.parseInt(prop.getProperty(ELEMENT_MODE));
     this.setReportValues (mode);
     String dtFrom = prop.getProperty(ELEMENT_DATE_FROM);
     String dtTo = prop.getProperty(ELEMENT_DATE_TO);
     if(DEBUG)
       trace(TraceLog.TRACE_LEVEL_DEBUG, "buildRequestFilename(): dtFrom= " + dtFrom + ";dtTo=" + dtTo, null);
 
      buffer.append("/acweb/");
      buffer.append(SERVER_NAME);
      buffer.append(this.reportPath);
      buffer.append(this.reportName);
      buffer.append(".rox;");
      buffer.append(this.reportVersion);
      buffer.append("?submit&DtFrom=");
      buffer.append(dtFrom);
      buffer.append("&DtTo=");
      buffer.append(dtTo);
      buffer.append("&__scheduleType=immediate&__wait=wait&__overwrite=old&__outputname=");
      buffer.append(this.nameOutput);
 
    trace(TraceLog.TRACE_LEVEL_DEBUG, "buildRequestFilename(): file: " + buffer.toString(), null);
    return buffer.toString();
 
  }

Open in new window

0
Bob LearnedCommented:
What is this section doing?

             session.setAttribute(FileProxyServlet.SESSION_PROTOCOL, PROTOCOL);
               session.setAttribute(FileProxyServlet.SESSION_HOST, HOST);
               session.setAttribute(FileProxyServlet.SESSION_CONTENT_TYPE, CONTENT_TYPE);
               session.setAttribute(FileProxyServlet.SESSION_FILE, reportFileName);
               session.setAttribute(FileProxyServlet.SESSION_ERROR_URL, URL_ERROR) ;
 
Bob
0
sanjaypandeyAuthor Commented:
this is the reply I got from the java developer :

that set some attributes in the http session for easy retrieval during page interaction. You can ignore them if your app does not need that interaction.
 that are basically the same parameters you need to build up the connection URL.
 
new URL(servletData.protocol, servletData.host, servletData.file);

0
Bob LearnedCommented:
Is this doing a GET or a POST?

Bob
0
sanjaypandeyAuthor Commented:
this is the reply I got from the java developer -

It does not matter. The Get method can call the post method.
 
0
Bob LearnedCommented:
All I can say is "huh?".  You need to find out what the browser uses when navigating to the report URL.

Bob
0
sanjaypandeyAuthor Commented:
looks like I am step closer... in that its not freezing up.....using this code below but its executing the code to display the report before report generation completes...    any thoughts or help


 varReportURL = "http://maroa/acweb/maroa/StrategicPolicyAnalysis/PPM.rox?Submit&__scheduleType=immediate&__overwrite=new&__outputname=/StrategicPolicyAnalysis/temp91.roi&" & Server.UrlEncode(varPARAMETERS)

        Dim myReq As HttpWebRequest = HttpWebRequest.Create(varReportURL)
        myReq.Method = WebRequestMethods.Http.Get
        Dim myResponse As HttpWebResponse = myReq.GetResponse
        Dim sline As String = ""
        Dim reader As New StreamReader(myResponse.GetResponseStream())
        Dim tmp As String = reader.ReadToEnd()
        myResponse.Close()
        varReportURL = "http://maroa/acweb/maroa/StrategicPolicyAnalysis/temp91.roi?ViewPage&format=pdf&action=view&operation=open"
        Response.Write("<script>window.open('" + varReportURL + "','','_target=blank', 'width=1000,height=600');</script>")


0
sanjaypandeyAuthor Commented:
Never mind.. I was able to resolve it :

I did had a issue with the report URL :
&__scheduleType=immediate&__wait=wait

varModelName = Session("SelectedTblName")
        varPARAMETERS = "P1=" & varP1 & "&P2=" & varP2 & "&P3=" & varP3 & "&ModelName=" & varModelName
        varReportURL = "http://maroa/acweb/maroa/StrategicPolicyAnalysis/PPM.rox?Submit&__scheduleType=immediate&__wait=wait&__overwrite=old&__outputname=/StrategicPolicyAnalysis/temp93.roi&" & Server.UrlEncode(varPARAMETERS)
        Dim myReq As HttpWebRequest = HttpWebRequest.Create(varReportURL)

        myReq.Method = WebRequestMethods.Http.Get
        Dim myResponse As HttpWebResponse = myReq.GetResponse
        Dim sline As String = ""
        Dim reader As New StreamReader(myResponse.GetResponseStream())
        Dim tmp As String = reader.ReadToEnd()
        myResponse.Close()

        varReportURL = "http://maroa/acweb/maroa/StrategicPolicyAnalysis/temp93.roi?ViewPage&format=pdf&action=view&operation=open"
        Response.Write("<script>window.open('" + varReportURL + "','','_target=blank', 'width=1000,height=600');</script>")
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
.NET Programming

From novice to tech pro — start learning today.