2015-10-20 104 views
1

問題網站調用asp.net網站API - 圖片上傳不成功

我需要什麼超時或設置改變?

概述顯示實驗A-E Overview

摘要

我有一個網站,讓一個XHR API調用一個asp.net網頁API網站。它正在上傳圖片。它將圖像作爲帶有Base64Content屬性的json對象發送。這些字節由base64編碼並由web api站點自動解碼。

我有我的網站項目設置在Visual Studio與調試,我也可以建立它並從IIS運行它。

我已經試過

一個。如果我使用Telerik Fiddler Web Debugger測試api調用web api rest站點,它會成功。這意味着,如果請求成功到達web api服務器,它將成功。所有的後端代碼都很好。

B。當Chrome調試器失敗時,將原始請求放入調試器工具中。我可以把這個原始請求,複製/粘貼到提琴手,它的作品。負責生成請求的網站的ajax部分都很好(請求由ajax代碼正確形成)。

C。如果我在使用IIS Express的Visual Studio中進行調試時運行我的網站,我沒有問題。它只發生在IIS中。整個web.config是相同的。

D。如果我通過網頁(使用Chrome)對網頁進行測試,它會成功讀取一個500kb的文件,但會失敗並顯示一個1兆文件。

E。當它失敗時,這個請求沒有記錄到web api服務器。我已經完全追蹤,沒有任何顯示。

失敗時,無論文件大小如何,它都會在5秒鐘失敗。因此,我得出結論:導致失敗的不是文件大小,而是任何需要超過5秒的上載。

我的設置

我無法找到我需要改變,我還沒有改變任何設置。

<system.webServer> 
    <security> 
     <requestFiltering> 
     <requestLimits maxAllowedContentLength="2147483647" /> 
     </requestFiltering> 
    </security> 
    </system.webServer> 

    <system.web> 
    <customErrors mode="Off"/> 
    <compilation debug="true" targetFramework="4.5.1"/> 
    <httpRuntime targetFramework="4.5" 
       maxRequestLength="2097152" 
       delayNotificationTimeout="360" 
       executionTimeout="360" 
       defaultRegexMatchTimeout="360" 
       /> 
    </system.web> 

請求日誌

491472: URL_REQUEST 
http://tmorrow-12v.hs.com/HS.REST.HomeownerPortal/api/tickets/281/images 
Start Time: 2015-10-20 18:51:35.464 

t=2876 [st= 0] +REQUEST_ALIVE [dt=4996] 
t=2876 [st= 0] URL_REQUEST_DELEGATE [dt=14] 
t=2890 [st= 14] +URL_REQUEST_START_JOB [dt=4982] 
        --> load_flags = 73986 (BYPASS_CACHE | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VERIFY_EV_CERT) 
        --> method = "POST" 
        --> priority = "LOW" 
        --> upload_id = "0" 
        --> url = "http://tmorrow-12v.hs.com/HS.REST.HomeownerPortal/api/tickets/281/images" 
t=2890 [st= 14]  URL_REQUEST_DELEGATE [dt=1] 
t=2891 [st= 15]  HTTP_CACHE_GET_BACKEND [dt=0] 
t=2891 [st= 15]  URL_REQUEST_DELEGATE [dt=0] 
t=2891 [st= 15]  +HTTP_STREAM_REQUEST [dt=1] 
t=2891 [st= 15]  HTTP_STREAM_REQUEST_STARTED_JOB 
         --> source_dependency = 491473 (HTTP_STREAM_JOB) 
t=2892 [st= 16]  HTTP_STREAM_REQUEST_BOUND_TO_JOB 
         --> source_dependency = 491473 (HTTP_STREAM_JOB) 
t=2892 [st= 16]  -HTTP_STREAM_REQUEST 
t=2892 [st= 16]  +HTTP_TRANSACTION_SEND_REQUEST [dt=4980] 
t=2892 [st= 16]  HTTP_TRANSACTION_SEND_REQUEST_HEADERS 
         --> POST /HS.REST.HomeownerPortal/api/tickets/281/images HTTP/1.1 
          Host: tmorrow-12v.hs.com 
          Connection: keep-alive 
          Content-Length: 2632959 
          Pragma: no-cache 
          Cache-Control: no-cache 
          Authorization: Basic [52 bytes were stripped] 
          Origin: http://tmorrow-12v.hs.com 
          HSHO-Cookie: UserProfile=userid=31&username=tmorrow%40hyphensolutions.com&appguid=a967da12-2965-4b23-921b-ed8a386649f4&buildproappguid=0b43e124-7755-4194-a441-1836f8e6db48&loginexpiration=10%2f21%2f2015+12%3a00%3a00+AM&Expires=10%2f21%2f2015+12%3a00%3a00+AM&reqver 
          User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 
          Content-Type: application/json; charset=UTF-8 
          Accept: application/json, text/plain, */* 
          Referer: http://tmorrow-12v.hs.com/homeownerportal/ 
          Accept-Encoding: gzip, deflate 
          Accept-Language: en-US,en;q=0.8 
          Cookie: [38 bytes were stripped] 
t=2892 [st= 16]  HTTP_TRANSACTION_SEND_REQUEST_BODY 
         --> did_merge = false 
         --> is_chunked = false 
         --> length = 2632959 
t=7872 [st=4996]  CANCELLED 
t=7872 [st=4996] -URL_REQUEST_START_JOB 
        --> net_error = -3 (ERR_ABORTED) 
t=7872 [st=4996] URL_REQUEST_DELEGATE [dt=0] 
t=7872 [st=4996] -REQUEST_ALIVE 
+0

你嘗試加入超時Ajax調用?如果您使用的是jQuery ajax函數,那麼錯誤處理程序可能會引發導致失敗的問題。 –

+0

@PankajKapare,謝謝。我在AngularJS中使用$ http。傳遞給失敗塊的對象爲null。客戶端代碼沒有使用超時。當它在IIS Express中運行時,它可以正常工作,因此不會有任何Angular時間有效(或者我推理)。無論如何,我爲'$ http'嘗試了'timeout',並將其設置爲3000(3秒),以查看它會做什麼。它沒有效果。 – toddmo

回答

0

嗯,嗯,是的。經過3天的調試,我發現:

最初的開發者已經使用這個代碼來向客戶端邏輯添加一個http攔截器,並且我沒有考慮沿請求過濾器的行並且沒有搜索我的項目是「5000」。當我看到$http沒有使用timeout參數時,我認爲沒有一個參數。

'use strict'; 

angular.module('myApp') 
    .factory('timeoutHttpIntercept', function() { 
    //this adds a timeout to every AJAX request 
    return { 
     'request': function(config) { 
     config.timeout = 5000; 
     return config; 
     } 
    }; 
    }); 

要解決它,我只是將值從5000更改爲60000.在其他api服務器的web.config中,我不需要任何特殊值。

Web服務器需要在web.config以下設置:

<system.webServer> 
    <security> 
     <requestFiltering> 
     <requestLimits maxAllowedContentLength="2147483647" /> 
     </requestFiltering> 
    </security> 
    </system.webServer> 

    <system.web> 
    <httpRuntime maxRequestLength="2147483647" /> 
    </system.web>