簡體   English   中英

錯誤消息為“此流不支持搜索操作”

[英]Error Message as "This stream does not support seek operations"

我嘗試在 C# 代碼中使用 webRequest 從下面的代碼打開。我嘗試了下面的代碼,但我收到錯誤消息“此流不支持搜索操作” 請檢查以下代碼並建議如何執行此操作。

    private static void DownloadCurrent() {
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://einvoicing
        .internal.cleartax.co/v2/eInvoice/download?
        irns=11eaf48a909dda520db27ff35804d4b42df2c3b6285afee8df586cc4dbd10541");
    webRequest.Method = "GET";
    webRequest.ContentType = "application/pdf";
    webRequest.Headers.Add("owner_id", "78c6beda-54a2-11ea-b064-0af3f8b02c24");
    webRequest.Headers.Add("gstin", "29AAFCD5862R000");
    webRequest.Timeout = 3000;
    webRequest.BeginGetResponse(new AsyncCallback(PlayResponeAsync), webRequest);
}

private static void PlayResponeAsync(IAsyncResult asyncResult) {
    long total = 0;
    long received = 0;
    HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState;

    try {
        using (HttpWebResponse webResponse = 
            (HttpWebResponse)webRequest.EndGetResponse(asyncResult)) {
            byte[] buffer = new byte[1024];

            FileStream fileStream = File.OpenWrite("[file name to write]");
            using (Stream input = webResponse.GetResponseStream()) {
                total = input.Length;

                int size = input.Read(buffer, 0, buffer.Length);
                while (size > 0) {
                    fileStream.Write(buffer, 0, size);
                    received += size;

                    size = input.Read(buffer, 0, buffer.Length);
                }
            }

            fileStream.Flush();
            fileStream.Close();
        }
    }
    catch (Exception ex) { }
}

如果可能,建議切換到 HttpClient :

為簡潔起見,我省略了標頭配置,但絕對可以做到。

static string url = "https://einvoicing.internal.cleartax.co/v2/eInvoice/download?irns=11eaf48a909dda520db27ff35804d4b42df2c3b6285afee8df586cc4dbd10541";

static HttpClient client = new HttpClient(); // Use same instance over app lifetime!

static async Task DownloadCurrentAsync()
{
     // config headers here or during instance creation
     HttpResponseMessage response = await client.GetAsync(url);
     response.EnsureSuccessStatusCode(); // <= Will throw if unsuccessful
     using (FileStream fileStream = new FileStream("[file name to write]", FileMode.Create, FileAccess.Write, FileShare.None))
     {
         //copy the content from response to filestream
         await response.Content.CopyToAsync(fileStream);
     }
}

請注意,這現在是 TAP,而不是傳統的異步模式 (APM)。

一些額外的考慮:

  • 對於彈性,我會考慮在此處使用“Polly”。 (我沒有附屬)
  • 客戶端實例可能應該通過 IHttpClientFactory 注入。

附錄:

如果您的應用程序的其余部分僅使用 APM,那么您可以查看Interop with Other Asynchronous Patterns and Types

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM