2011-07-28 16 views
7

मुझे डब्ल्यूसीएफ स्ट्रीमिंग फ़ाइल स्थानांतरण पर एक अच्छा उदाहरण चाहिए।डब्ल्यूसीएफ स्ट्रीमिंग फ़ाइल स्थानांतरण .NET 4

मुझे कई मिल गए हैं और उन्हें आजमाया है लेकिन पोस्ट पुरानी हैं और मैं .NET 4 और IIS 7 पर wokding कर रहा हूं इसलिए कुछ समस्याएं हैं।

क्या आप मुझे उस पर एक अच्छा और अद्यतित उदाहरण दे सकते हैं।

+0

स्ट्रीमिंग से आपका क्या मतलब है? क्या आप मीडिया सामग्री (आईई, वीडियो या एमपी 3) के लिए डब्ल्यूसीएफ का उपयोग करने की कोशिश कर रहे हैं या क्या आप क्लाइंट को बाइनरी जानकारी वापस भेजना चाहते हैं? – Kane

+0

मूल रूप से मैं http पर अपने सर्वर पर फ़ाइलों को अपलोड करने की कोशिश कर रहा हूं। – tugberk

उत्तर

7

एक पोस्टिंग बाइनरी डेटा को एक आरामदायक सेवा के लिए कुछ तकनीकों का उपयोग करके निम्नलिखित उत्तरों का विवरण दें।

निम्नलिखित कोड है कि कैसे आप एक RESTful WCF सेवा लिख ​​सकता का एक नमूना है और पूरा भी तरह से नहीं है, लेकिन आप जहां पर इस बात का संकेत देता है आप शुरू कर सकते हैं

नमूना सेवा, ध्यान दें कि यह उत्पादन तैयार कोड नहीं है।

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class FileService 
{ 
    private IncomingWebRequestContext m_Request; 
    private OutgoingWebResponseContext m_Response; 

    [WebGet(UriTemplate = "{appName}/{id}?action={action}")] 
    public Stream GetFile(string appName, string id, string action) 
    { 
     var repository = new FileRepository(); 
     var response = WebOperationContext.Current.OutgoingResponse; 
     var result = repository.GetById(int.Parse(id)); 

     if (action != null && action.Equals("download", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      response.Headers.Add("Content-Disposition", string.Format("attachment; filename={0}", result.Name)); 
     } 

     response.Headers.Add(HttpResponseHeader.ContentType, result.ContentType); 
     response.Headers.Add("X-Filename", result.Name); 

     return result.Content; 
    } 

    [WebInvoke(UriTemplate = "{appName}", Method = "POST")] 
    public void Save(string appName, Stream fileContent) 
    { 
     try 
     { 
      if (WebOperationContext.Current == null) throw new InvalidOperationException("WebOperationContext is null."); 

      m_Request = WebOperationContext.Current.IncomingRequest; 
      m_Response = WebOperationContext.Current.OutgoingResponse; 

      var file = CreateFileResource(fileContent, appName); 

      if (!FileIsValid(file)) throw new WebFaultException(HttpStatusCode.BadRequest); 

      SaveFile(file); 

      SetStatusAsCreated(file); 
     } 
     catch (Exception ex) 
     { 
      if (ex.GetType() == typeof(WebFaultException)) throw; 
      if (ex.GetType().IsGenericType && ex.GetType().GetGenericTypeDefinition() == typeof(WebFaultException<>)) throw; 

      throw new WebFaultException<string>("An unexpected error occurred.", HttpStatusCode.InternalServerError); 
     } 
    } 

    private FileResource CreateFileResource(Stream fileContent, string appName) 
    { 
     var result = new FileResource(); 

     fileContent.CopyTo(result.Content); 
     result.ApplicationName = appName; 
     result.Name = m_Request.Headers["X-Filename"]; 
     result.Location = @"C:\SomeFolder\" + result.Name; 
     result.ContentType = m_Request.Headers[HttpRequestHeader.ContentType] ?? this.GetContentType(result.Name); 
     result.DateUploaded = DateTime.Now; 

     return result; 
    } 

    private string GetContentType(string filename) 
    { 
     // this should be replaced with some form of logic to determine the correct file content type (I.E., use registry, extension, xml file, etc.,) 
     return "application/octet-stream"; 
    } 

    private bool FileIsValid(FileResource file) 
    { 
     var validator = new FileResourceValidator(); 
     var clientHash = m_Request.Headers[HttpRequestHeader.ContentMd5]; 

     return validator.IsValid(file, clientHash); 
    } 

    private void SaveFile(FileResource file) 
    { 
     // This will persist the meta data about the file to a database (I.E., size, filename, file location, etc) 
     new FileRepository().AddFile(file); 
    } 

    private void SetStatusAsCreated(FileResource file) 
    { 
     var location = new Uri(m_Request.UriTemplateMatch.RequestUri.AbsoluteUri + "/" + file.Id); 
     m_Response.SetStatusAsCreated(location); 
    } 
} 

नमूना क्लाइंट, ध्यान दें कि यह नहीं उत्पादन के लिए तैयार कोड है।

// ********************************* 
// Sample Client 
// ********************************* 
private void UploadButton_Click(object sender, EventArgs e) 
{ 
    var uri = "http://dev-fileservice/SampleApplication" 
    var fullFilename = @"C:\somefile.txt"; 
    var fileContent = File.ReadAllBytes(fullFilename); 

    using (var webClient = new WebClient()) 
    { 
     try 
     { 
      webClient.Proxy = null; 
      webClient.Headers.Add(HttpRequestHeader.ContentMd5, this.CalculateFileHash()); 
      webClient.Headers.Add("X-DaysToKeep", DurationNumericUpDown.Value.ToString()); 
      webClient.Headers.Add("X-Filename", Path.GetFileName(fullFilename)); 
      webClient.UploadData(uri, "POST", fileContent); 

      var fileUri = webClient.ResponseHeaders[HttpResponseHeader.Location]; 
      Console.WriteLine("File can be downloaded at" + fileUri); 
     } 
     catch (Exception ex) 
     { 
      var exception = ex.Message; 
     } 
    } 
} 

private string CalculateFileHash() 
{ 
    var hash = MD5.Create().ComputeHash(File.ReadAllBytes(@"C:\somefile.txt")); 
    var sb = new StringBuilder(); 

    for (int i = 0; i < hash.Length; i++) 
    { 
     sb.Append(hash[i].ToString("x2")); 
    } 

    return sb.ToString(); 
} 

private void DownloadFile() 
{ 
    var uri = "http://dev-fileservice/SampleApplication/1" // this is the URL returned by the Restful file service 

    using (var webClient = new WebClient()) 
    { 
     try 
     { 
      webClient.Proxy = null; 
      var fileContent = webClient.DownloadData(uri); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 
+0

ठीक है, यह छोटी फ़ाइलों के लिए अच्छा है लेकिन बड़ी फ़ाइलों के बारे में कैसे? आरईएसटी उदाहरण पर कोई भी कोड नमूना बहुत अच्छा होगा – tugberk

+0

एक डब्ल्यूसीएफ सेवा – Kane

+0

महान उदाहरण लिखने के तरीके पर एक कोड नमूना जोड़ा गया। धन्यवाद यह जल्द ही कोशिश करेगा। क्या आपको लगता है कि एसओएपी रास्ता बेहतर तरीका है? – tugberk

संबंधित मुद्दे