2016-08-08 2 views
0

Compact Framework에서 REST를 통해 서버로 파일을 전송하는 가장 좋은 방법을 찾고 있습니다. .net 웹 API를 사용하여 만든 웹 서비스가 있습니다. 나는 파일을 보내는 것을 다루는 몇 가지의 다른 질문과 다른 사이트를 살펴 보았지만, 나는 그들에게 필요한 것들이 내가 원하는 것을 위해 일하는 것 같지 않다.Compact Framework - REST를 통해 파일 업로드

WM 6 및 6.5 장치에서 내 REST 서비스로 미디어 파일을 보내려고합니다. 파일의 대부분은 300k 미만이지만 이상한 수는 2 ~ 10 메가 바이트 정도 될 수 있습니다. 누구든지이 작품을 만들기 위해 사용할 수있는 발췌 문장이 있습니까?

감사합니다.

+0

다른 질문/사이트에 대한 제안과 함께 작동하지 않는 것을 지정할 수 있습니까? 그렇지 않으면 여기에있는 답변이 귀하에게 적합하지 않을 수도 있습니다. –

+0

물론 - XML ​​또는 텍스트 파일을 보내는 곳을 몇 개 보았습니다.이 파일은 문자열로 일련 번호가 매겨졌습니다. 또는 데이터 구조를 파일로 직렬화하는 일부 (protobuf와 유사). 필자도 멀티 파트 프로토콜을 사용하는 곳을 보았지만 컴팩트 한 프레임 워크는이를 지원하지 않습니다. – Kyver

+0

대부분의 예제는'multipart/form-data'를 포함합니다. 코드를 직접 코딩 할 수는 있지만 실제로 파일을 전송할 필요는 없습니다. 나는 그 예를 올릴 것이다. –

답변

1

나는이 파일을 전송하기위한 최소한의 생각 :

using (var fileStream = File.Open(@"\file.txt", FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.destination.com/path"); 
    request.Method = "POST"; // or PUT, depending on what the server expects 
    request.ContentLength = fileStream.Length; // see the note below 
    using (var requestStream = request.GetRequestStream()) 
    { 
     int bytes; 
     byte[] buffer = new byte[1024]; // any reasonable buffer size will do 
     while ((bytes = fileStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      requestStream.Write(buffer, 0, bytes); 
     } 
    } 

    try 
    { 
     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     { 

     } 
    } 
    catch (WebException ex) 
    { 
     // failure 
    } 
} 

참고 : HTTP 당신이 데이터를 전송 "할"때 알 수있는 방법이 필요합니다.

  • 의 예에서 사용 된 우리가 설정 아무것도
  • request.SendChunked을 보내기 전에 파일의 크기를 알고 있기 때문에, request.ContentLength을 설정, 개별 크기
  • 를 포함하는 데이터의 덩어리를 보내는이를 달성하기 위해 세 가지 방법이 있습니다
  • 도 메모리 버퍼에 쓰기 위해 request.AllowWriteStreamBuffering을 설정할 수 있지만 컴팩트 프레임 워크에 많은 메모리를 낭비하지 않는 것이 좋습니다.
+0

나는 이것을 시험해 보았고 어떤 문제에 부딪쳤다. 첫째, CF 요청 스트림은 char 배열 만 허용합니다. 나는 requestStream.BaseStream.Write를 사용할 수 있었다. 그러나 내 REST 응용 프로그램 ("원격 서버에서 오류를 반환했습니다 : (500) 내부 서버 오류.")에서 내부 서버 오류가 계속 발생하여 이것이 오류의 원인인지 확실하지 않습니다. Postman을 사용하여 테스트 데이터를 보낼 수는 있지만 훌륭하게 작동하지만 CF 응용 프로그램으로 인해 서버에서 오류가 발생합니다. 이것은 제가 CF 측에서 뭔가 잘못되었다고 생각하게 만듭니다. – Kyver

+0

CF에서 문자 배열 만 허용하는 제한은 없습니다 (2.0 이상 3.5는 아님). 문제는 서비스가 JSON 또는 XML과 같은 특정 _format_에 데이터가 전송되기를 기대하며,이 경우 바이너리 데이터를 인코딩해야합니다 (예 : Base64 사용). –

+0

훌륭합니다. 이제 모든 것이 작동합니다. RequestStStream에 StreamWriter 객체를 사용했습니다. RequestStream에서는 바이트 배열을 허용하지 않습니다. 또한 후기 바인딩을 지원하지 않으므로 CF에서 객체를 사용할 수 없습니다. 나는 Stream 객체로 바꿨다. 아무런 문제가 없었다. 서버 오류에 관해서는, 그것은 우편 배달부와 테스트하는 동안 내 로컬 컴퓨터에서 작동하고있었습니다. 배포 문제로 인해 실제로 작동하지 않았습니다. 감사! – Kyver