2014-08-19 2 views
0

예상대로 작동하는 다음 코드가 있습니다. 그 아래에서 나는 모든 것을 올바르게 처리하도록 문장을 사용하는 것을 추가 할 것이라고 생각했지만, 크롬에서 No data received error 페이지를 얻었을 때. 이 사용 문이 disposing 때문에 (내가 생각할 수있는 유일한 가능성 ...) webresponse 개체의 스트림을 반환하고 제대로 webresponse 처리 할 수 ​​있습니까? 이 코드는 웹 서비스에 호출 될 때 스트림이 리턴되고,이 코드는 클라이언트에 파일을 업로드합니다. 적어도 주어진 첫 번째 예제에서 작동합니다.반환 값을 변경하는 문 사용

public Stream test(string fileName) //this works fine 
{ 
    WebResponse webResponse = webRequest.GetResponse(); 
    Stream stream = webResponse.GetResponseStream(); 
    context.OutgoingResponse.Headers["Content-Disposition"] = string.Format("filename= {0}", fileName); 
    return stream; 
} 

public Stream test(string fileName)///gives No data recieved error in chrome 
{ 
    WebResponse webResponse; 
    using(webResponse = webRequest.GetResponse()) 
    { 
     Stream stream = webResponse.GetResponseStream(); 
     context.OutgoingResponse.Headers["Content-Disposition"] = string.Format("filename= {0}", fileName); 
     return stream; 
    } 
} 
+0

스트림으로 무엇을하고 있습니까? –

+0

해당 정보가 질문의 끝 부분에 추가되었습니다. – Timigen

+0

@ X-li 게시물을 개선해 주셔서 감사합니다. 그러나 상당한 수정 만하십시오. 적어도 3 명이 승인을 받기 전에 변경 사항을 검토해야합니다. 그것은 검토 자의 시간이 걸립니다. 그럴만 한 가치가 있도록하고 승인을받지 않고 편집 할 담당자가 충분한 사용자에게 사소한 편집을 맡기십시오. 감사. – Taifun

답변

3

이 코드를 실행하는 컨텍스트의 종류와 스트림에서 수행하는 작업에 대해서는 잘 모릅니다. 그러나 여기에는 제 추론이 있습니다.

WebResponseIDisposable입니다. 즉, using 문에 넣으면 스코프 끝에 배치됩니다.

  1. WebResponse 인스턴스를 처분하고 있습니다 : webResponse.
  2. webResponse은 처분 될 때 자신의 모든 IDisposable을 처분합니다.
  3. webResponse은 응답 스트림 : stream을 처리합니다.
  4. test 함수는 stream을 반환합니다.
  5. stream은 폐기 되었기 때문에 사용할 수 없습니다.
  6. 문제가 발생했습니다.

편집 :

대답 귀하의 코멘트에 :

여기 http://msdn.microsoft.com/en-us/library/system.idisposable(v=vs.110).aspx

에 정의 된 IDisposable 객체가 작동 할 것으로 예상된다 방법

전형적인 IDisposable 클래스 구현 :

// ExampleClass is similar to WebResponse 
public class ExampleClass: IDisposable 
{ 
    private IDisposable somethingDisposable; 
    private bool disposed = false; 

    public ExampleClass() 
    { 
     somethingDisposable = new ... 
     ... 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     // Check to see if Dispose has already been called. 
     if(!this.disposed) 
     { 
      if(disposing) 
      { 
       // Your stream is disposed similar to 
       // what happens here: 
       // IDisposable objects dispose all managed/unmanaged 
       // resources that they have in their Dispose function. 

       somethingDisposable.Dispose(); 
      } 

      disposed = true; 
     } 
    } 

    // This is similar to WebResponse.GetResponseStream 
    public IDisposable GetSomethingDisposable() 
    { 
     return somethingDisposable; 
    } 
} 

public static void Main() 
{ 
    IDisposable d; 
    using(var e = new ExampleClass()) { 
     d = e.GetSomethingDisposable(); 
    } 
    // here both e and d are disposed. 
} 
+0

나는 데이터를 포함하는 변수를 왜 처분 할까? 그것은 처분하는 물체에서 곧바로 오는 곳이 확실합니다. –

+0

@ No1_Melman 스트림에 데이터가 없습니다. 소스에서 데이터를 가져 오는 메커니즘입니다. 스트림이 삭제되면 데이터를 가져올 수 있습니다. 요청이 완료되거나 스트림을 반환하지 않을 때까지 요청을 처리하지 않아야합니다 (대신 바이너리 데이터를 반환). –

+0

[email protected] No1_Melman - 'Dispose'는 객체와 객체가 소유 한 객체를 모두 삭제합니다. 즉, WebRespose는 헤더, 응답 스트림을 소유합니다. 과거의 "폐기 된"상태 (또는 "처분 된"상태가 전혀없고 해당하는 'Dispose'도 없음)에서 사용할 수있는 객체와 (대부분의'Steam'에서 파생 된 객체와 같은) 다른 객체는 처분 후 완전히 쓸모가 없습니다 방금 알아 낸대로. 다른 일반적인 경우는 내부 스트림을 처리하는'Writer' 객체입니다. –

1

응답 리소스를 정리하면 전달하려는 리소스가 정리 된 리소스를 정리해야하므로 더 이상 사용하지 못하게됩니다.

해당 스트림을 사용한 후에는 의 자원을 처분해야합니다.