2012-04-25 3 views
3

내 Windows Phone에서 하늘색 웹 역할로 호스팅되는 WCF API로 요청을 보내는 앱을 성공적으로 만들었습니다. RestSharp를 사용하여 편안한 POST 메서드를 사용하고 있습니다. 모든 것이 훌륭하게 작동하고 이미지가 저장 공간에 나타나지만 이미지가 일반 이미지 파일로 열리지 않습니다.RestSharp를 사용하여 WCF API에 이미지 업로드 - 이미지가 유효하지 않음

메타 데이터 정보에 이전에 업로드 한 다른 이미지와 비교하면 볼 수없는 이미지에 "AKEYWqGgulwi6/9/VY2KPg =="과 같은 내용으로 설정된 contentMD5 필드가 있습니다 (다른 사람은 그렇지 않지만). 파일에 어떤 문제가 발생 했습니까?

RestSharp 코드를 첨부했는데, 내가하지 말아야 할 부분을 추가하고 있습니까? 이것이 imagestream이 조작되는 유일한 장소이기 때문에 내가 의심하는 오류가 여기에서 왔음에 틀림 없습니다.

request.AddFile(null, byteArray, null); 

스트림의 길이를 변경하고 또한 contentMD5 필드가 비어 만든 :

public void SendRequest(Stream imageStream, string imageID) 
    { 
     var client = new RestClient(); 
     client.BaseUrl = apiAddress; 
     var request = new RestRequest("agerecog/{imageName}", Method.POST); 
     request.AddUrlSegment("imageName", imageID); 

     //convert imagestream to byte array 
     var byteArray = new byte[imageStream.Length]; 
     imageStream.Read(byteArray, 0, (int)imageStream.Length); 

     //add byteArray to request 
     request.AddFile("image/jpeg", byteArray, imageID); 
     var url = client.BuildUri(request).ToString(); 
     client.ExecuteAsync<VizageResponse>(request, response => 
      { 
       //request info. to be added here 
      }); 
    } 

편집 # 1

는 몇 가지 작업 후 나는이에 addFile 라인을 변경하기로 결정했다. 그러나 이미지는 여전히 유효한 이미지 파일이 아닙니다. 실제로 비교할 이미지는 Windows Phone 에뮬레이터에서 가져온 것이므로 모서리에 검은 색 사각형이있는 동일한 흰색 페이지 여야합니다. 그러나 파일 사이에는 크기가 다릅니다 (유효 이미지 파일의 길이는 5670입니다. 원래 코드 6076 길이가에 도착하면, 상기 제 addFile)

EDIT # 2 상기 화상 전에 스트림 길이 속성이 6116 인 전송 될 때, 좀 더 분석 수행을 사용하여 6239 길이 서버이지만 6370입니다. 264는 RestSharp 메소드의 어딘가에서 추가되었거나 데이터 스트림이 서버 측에서 해석 될 때 추가됩니다. WCF 서비스 코드 :

[WebInvoke(UriTemplate = "/agerecog/{imageName}", Method = "POST")] 
    VizageResult analyseFace(string imageName, Stream imageStream); 
+0

Fiddler와 요청을 비교할 수 있습니까? 스트림에 직접 쓰는 AddFile 오버로드가 필요할 수도 있습니다. –

+0

감사합니다. John, 불행히도 하늘빛 서비스가 내 로컬 개발 환경에서 호스팅되기 때문에 피들을 사용할 수 없습니다. 그러나 위의 편집에 추가 할 작업을 조금 조사했습니다. 나는 스트림에 직접 글을 쓸 것입니다. –

+0

스트림을 직접 스트리밍하는 것은 불행히도 작동하지 않는 것 같습니다. –

답변

3

문제는 최종적으로 문제를 해결하고 화상을 최종 결과로서 표시

를 해결했다. 일어난 일은 imageStream도 파일의 이름에 관한 데이터를 포함하고 있었기 때문에 (Azure에 저장되었을 때) 이미지 파일로 나타나지 않게되었습니다.

서버 측에있는 http://multipartparser.codeplex.com/ MultipartParser 클래스를 사용하여 요청을 파일 이름 및 파일 스트림 청크로 구문 분석하여이 문제를 해결했습니다. 그런 다음 정상적인 프로세스를 사용하여이 바이트 []에서 이미지를 저장했습니다.

그 구성 부분으로 WebRequest 클래스 데이터를 구문 분석하는 내 코드는 다음과 발견 :

MemoryStream imageStream = new MemoryStream(); 

    MultipartParser parser = new MultipartParser(dataStream); 
     if (parser != null && parser.Success) 
     { 
      imageName = parser.Filename; 
      imageStream.Write(parser.FileContents, 0, parser.FileContents.Length); 
     } 

당신은 메모리 스트림 0으로 다시 위치를 설정하는 것을 잊지 사용할 때 - 내가 만든 남학생의 실수를!

+0

하지만 내가 리눅스 시스템에서 타사 웹 서비스가 있다면 어떻게해야합니까?! 아직도 쉬는 것 같아요 .Salp 버그. 요청을 보내기 전에 누군가가 HTTP-body를 수정하는 방법을 알고 있습니까? – EvgeniyK

+0

답장을 보내지 않으신 것에 대해 사과드립니다. 불행히도 –

0

RestSharp는별로 익숙하지 않습니다. MD5가 정확한지 확인할 수 있습니까? blob의 데이터와 원본 이미지 파일의 데이터를 비교해보십시오. 예를 들어 첫 번째/마지막 몇 바이트가 동일한 지 여부와 같은 크기인지 여부를 확인합니다 (중간의 바이트도 동일하다고 가정).

+0

고마워, 나는 지금 그것을 시도 할 것이다. 나는 위의 편집을했다. 시도하고 몇 가지 더 문제의 경로 원인을 찾을 수 –

관련 문제