2012-01-30 11 views
6

मुझे डब्ल्यूसीएफ वेब एपीआई के साथ वास्तविक समस्या है।फ़ाइल अपलोड करने में त्रुटि WCF WEB API (पूर्वावलोकन 6): कॉन्फ़िगर किए गए अधिकतम बफर आकार की तुलना में बफर में अधिक बाइट्स नहीं लिख सकता: 65536

मेरे पास एक साधारण विधि है जो फ़ाइल अपलोड करती है और डिस्क पर सहेजती है। ऐसा लगता है कि मैंने सभी सही पैरा सेट किए हैं, लेकिन जब मैं 2 एमबी फ़ाइल अपलोड करने का प्रयास करता हूं तो उपरोक्त त्रुटि संदेश प्राप्त करें।

सर्वर कोड:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    HttpServiceHostFactory _factory = new HttpServiceHostFactory(); 

    var config = new HttpConfiguration() 
    { 
     EnableTestClient = true, 
     IncludeExceptionDetail = true, 
     TransferMode = System.ServiceModel.TransferMode.Streamed, 
     MaxReceivedMessageSize = 4194304, 
     MaxBufferSize = 4194304  
    }; 

    _factory.Configuration = config; 

    RouteTable.Routes.Add(new ServiceRoute("api/docmanage", _factory, typeof(WorksiteManagerApi))); 
} 

ग्राहक:

HttpClientHandler httpClientHandler = new HttpClientHandler(); 
httpClientHandler.MaxRequestContentBufferSize = 4194304; 

var byteArray = 
    Encoding.ASCII.GetBytes(ConnectionSettings.WebUsername + ":" + ConnectionSettings.WebPassword); 

HttpClient httpClient = new HttpClient(httpClientHandler); 
httpClient.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 
httpClient.BaseAddress = new Uri(ConnectionSettings.WebApiBaseUrl); 
httpClient.MaxResponseContentBufferSize = 4194304; 

... 

multipartFormDataContent.Add(new FormUrlEncodedContent(formValues)); 
multipartFormDataContent.Add(byteArrayContent); 

var postTask = httpClient.PostAsync("api/docmanage/UploadFile", multipartFormDataContent); 

फिर, सर्वर पर:

[WebInvoke(Method = "POST")] 
public HttpResponseMessage UploadFile(HttpRequestMessage request) 
{ 
    // Verify that this is an HTML Form file upload request 
    if (!request.Content.IsMimeMultipartContent("form-data")) 
    { 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
    } 

    // Create a stream provider for setting up output streams 
    MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider(); 

    // Read the MIME multipart content using the stream provider we just created. 
    IEnumerable<HttpContent> bodyparts = request.Content.ReadAsMultipart(streamProvider); 

    foreach (var part in bodyparts) 
    { 
     switch (part.Headers.ContentType.MediaType) 
     { 
      case "application/octet-stream": 
       if (part.Headers.ContentLength.HasValue) 
       { 
        // BLOWS UP HERE:    
        var byteArray = part.ReadAsByteArrayAsync().Result; 

        if (null == fileName) 
        { 
         throw new HttpResponseException(HttpStatusCode.NotAcceptable); 
        } 
        else 
        { 
         uniqueFileId = Guid.NewGuid().ToString(); 
         string tempFilename = Path.GetTempPath() + @"\" + uniqueFileId + fileName; 

         using (FileStream fileStream = File.Create(tempFilename, byteArray.Length)) 
         { 
          fileStream.Write(byteArray, 0, byteArray.Length); 
         } 
        } 

       } 
       break; 
     } 
    } 
} 

कोई भी विचार? मैं वेब एपीआई के नवीनतम पूर्वावलोकन का उपयोग कर रहा हूं .... मैंने देखा कि समर्थन दस्तावेज से बहुत कुछ गुम है लेकिन ऐसा लगता है कि कुछ बफर सीमा है जो मुझे नहीं पता कि कैसे निर्दिष्ट किया जा सकता है या अनदेखा किया जा रहा है .... ।

+0

कोड पोस्ट करते समय कृपया सुनिश्चित करें कि इसे यथासंभव पठनीय के रूप में स्वरूपित किया गया है। लोगों को बुरी तरह से स्वरूपित नमूने के माध्यम से अपना समय बिताने के लिए कहना मुश्किल है। –

+0

क्या आपके पास सर्वर और क्लाइंट पर कोई कॉन्फ़िगर प्रविष्टियां हैं? यदि ऐसा है तो क्या आप उन्हें भी पोस्ट कर सकते हैं – Rajesh

+0

केवल कोड के लिए सभी कॉन्फ़िगरेशन छोड़ दिया ... आप निर्माण (और क्लाइंट पर) पर सेवा में पारित कॉन्फ़िगर पैराम देख सकते हैं .... –

उत्तर

4

चीजें हैं जो है (की कमी) में स्पष्ट नहीं किया जाता में से एक HttpContent वर्ग के लिए प्रलेखन कि डिफ़ॉल्ट आंतरिक बफर 64K है इसलिए कोई भी सामग्री जो धारा नहीं है, उस सामग्री को 64kb से अधिक हो जाने पर अपवाद को फेंक देगा।

part.LoadIntoBufferAsync(bigEnoughBufferSize).Result(); 
var byteArray = part.ReadAsByteArrayAsync().Result; 

मुझे लगता है कि HttpContent वर्ग के बफर पर 64K सीमा सर्वर पर ज्यादा स्मृति आवंटन घटित करने के लिए रोकने के लिए है:

इसके चारों ओर जिस तरह से निम्नलिखित का प्रयोग है। मुझे आश्चर्य है कि क्या आप बाइट सरणी सामग्री को स्ट्रीमकंटेंट के रूप में पारित करने के बेहतर होंगे? इस तरह यह अभी भी HttpContent बफर आकार को बढ़ाने के बिना काम करना चाहिए।

+0

इसके लिए धन्यवाद मैं इसे सोमवार को जाने दूंगा। –

+0

इसके लिए धन्यवाद .. इसे हल करें। वापस आने से पहले बस उम्र ले ली और कोड का पुनरीक्षण किया ... बस कहें कि एक कारण था कि मैंने उस सुविधा पर देरी की जो इस पर निर्भर था! –

1

आप web.config में maxRequestLength सेट है:

<httpRuntime maxRequestLength="10240" /> 
+0

अनुरोध पर कोई समस्या नहीं है पक्ष ... अनुरोध सर्वर को ठीक हो जाता है ... केवल समस्या तब होती है जब कोड बाइट सरणी में सामग्री को पढ़ने का प्रयास करता है ... इस बिंदु पर यह बफर आकार सीमा का उल्लंघन करता है, भले ही यह स्पष्ट रूप से सेट किया गया हो जब सेवा की मेजबानी की गई .... मुझे डब्ल्यूसीएफ में एक बग महसूस हो रहा है .... –

0

मैं कुछ दिनों के लिए डब्ल्यूसीएफ विनैपी के साथ एक ही समस्या से जूझ रहा था, मैं 12 एमबी की फाइल पोस्ट करने की कोशिश कर रहा था और मुझे पता नहीं चल रहा था कि क्या हो रहा था। मेरा सर्वर पक्ष आईआईएस में होस्ट की गई डब्ल्यूसीएफ सेवा थी; मेरी समस्या डब्लूसीएफ सेटिंग्स नहीं थी लेकिन टोनी ने क्या बताया। आईआईएस में होस्टिंग करते समय, इस सेटिंग को बढ़ाने के लिए याद रखें। एमएस दस्तावेज इंगित करता है कि डिफ़ॉल्ट मान 4 एमबी है, जो बताता है कि मैं 400 केबी की फाइलें क्यों पोस्ट कर सकता हूं।

उम्मीद है कि यह दूसरों को एक ही तरह की परेशानी के साथ मदद करता है।