2012-01-12 2 views
3

나는 C# REST Webservice를이 다음과 같은 방법을 노출 있습니다유니 코드 문자 요청

[OperationContract] 
     [WebGet 
      (
      BodyStyle = WebMessageBodyStyle.Bare, 
      RequestFormat = WebMessageFormat.Xml, 
      ResponseFormat = WebMessageFormat.Xml, 
      UriTemplate = "/Files?id={ID}" 
      ) 
     ] 
     Stream GetFilesForID(string ID); 

이 방법은 사용자가 지정한 ID를 기반으로, 데이터베이스에서 정보를 가져옵니다. 이 ID에는 중국어 문자가있을 수 있습니다. 방법에 대한

내 구현 :

public Stream GetFilesForID(string ID) 
{ 
    ID = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(ID)); 

    // and connect to database and 
    // stream back the list. 
} 

는 "ID"아직도에서 중국어 문자가 포함되어 있지 않습니다. 다음과 같이 보입니다 : ã³ãã«-太é

C++로 작성되었으며이 REST Webservice 메소드를 winHTTP 라이브러리를 사용하여 호출하는 클라이언트 코드가 있습니다. 나도 바이올린을 사용하여 이것을 테스트했지만 동일한 결과를 얻습니다. 즉, 중국어 문자가 이상한 문자로 표시됩니다.

요청 본문에 유니 코드 문자가있는 "POST"메서드가있는 경우 내 webservice 메서드는 아무 문제없이 요청 본문을 가져옵니다. 나는 이런 식으로 할 필요조차 없다 : Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(requestBody));

나는 무엇이 여기에 놓치고 있냐? HTTP GET 요청을 보내기 전에 다른 작업을 수행해야합니까?

답변

2

C#이 처리 할 수있는 모든 문자는 유니 코드 문자입니다.

URI에서 이스케이프 처리되지 않은 일부 문자 만 유효합니다. 더 많은 정보가 IRI에서 허용되지만 여기에 URI가 필요합니다.

쿼리 부분에는 항상 Uri.EscapeDataString을 사용해야합니다.

Uri.EscapeDataString("孫子兵法 孫武") 
//returns %E5%AD%AB%E5%AD%90%E5%85%B5%E6%B3%95%20%E5%AD%AB%E6%AD%A6 

을뿐만 아니라 문제가 영어와 다른 언어 :뿐만 아니라 그것은 중국과 deail 것은 첫 않습니다 정확히 실행 취소 때문에

Uri.EscapeDataString("A naïve approach = trouble waiting + bugs & complaints!") 
//A%20na%C3%AFve%20approach%20%3D%20trouble%20waiting%20%2B%20bugs%20%26%20complaints! 

덧붙여, ID = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(ID))ID = ID에 해당합니다. 소스 중국어 문자열 대신 낯 익은 것을 보았다는 사실은 나중에 다른 것과 관련이 있습니다.