2012-07-24 2 views
1

웹 사이트 1에서 GET 요청을 시작하는 GET 웹 서비스를 만들려고합니다 ... 웹 사이트 2 및 웹 사이트 2에 요청을 보내면 개체 목록을 보내 응답합니다. Json.net을 사용하여 객체 목록을 직렬화 및 비 직렬화합니다.MVC 3 웹 서비스 및 응답

내가이 질문의 도움과 함께 POST의 웹 서비스를 넣었습니다 .. WebService ASP.NET MVC 3 Send and Receive

하지만 내 새로운 요구 사항에 대한 그 예를 적응에 지금까지 실패있었습니다. 여기

은 .. 내가 지금까지 웹 사이트 1이 무엇
public class GetAPIController : Controller 
{ 
    // 
    // GET: /Api/GetAPI/ 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult GetScientificFocusAreas() 
    { 
     //Get list of SFAs 
     List<ScientificFocusArea> ListSFA = CreateList.ScientificFocusArea(); 

     string json = JsonConvert.SerializeObject(ListSFA, Formatting.Indented); 

     //Send the the seralized object. 
     return Json(json); 

    } 

} 

또한, 웹 사이트 2에, 나는이 길을 등록한

웹 사이트 2 다음
public static List<ScientificFocusArea> ScientificFocusAreas() 
    { 
     string apiURL = "http://localhost:50328/Api/GetAPI"; 

     //Make the post 
     ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true; 

     //var bytes = Encoding.Default.GetBytes(body); 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiURL); 
     Stream stream = null; 
     try 
     { 
      request.KeepAlive = false; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.Timeout = -1; 
      request.Method = "GET"; 
     } 
     finally 
     { 
      if (stream != null) 
      { 
       stream.Flush(); 
       stream.Close(); 
      } 
     } 

     List<ScientificFocusArea> listSFA = WebService.GetResponse_ScientificFocusArea(request); 

     return listSFA; 
    } 

    public static List<ScientificFocusArea> GetResponse_ScientificFocusArea(HttpWebRequest request) 
    { 
     List<ScientificFocusArea> listSFA = new List<ScientificFocusArea>(); 

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

      using (Stream responseStream = response.GetResponseStream()) 
      { 
       if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created) 
       { 
        throw new HttpException((int)response.StatusCode, response.StatusDescription); 
       } 

       var end = string.Empty; 
       using (StreamReader reader = new StreamReader(responseStream)) 
       { 
        end = reader.ReadToEnd(); 
        reader.Close(); 

        listSFA = JsonConvert.DeserializeObject<List<ScientificFocusArea>>(end); 
       } 

       response.Close(); 
      } 
     } 

     return listSFA; 
    } 

... 수신 요청의 경우 ...

 context.MapRoute(
"GetScientificFocusAreas", 
"Api/GetAPI/", 
new 
{ 
    controller = "GetAPI", 
    action = "GetScientificFocusAreas", 
    id = UrlParameter.Optional 
} 

);

현재 오류가 발생했습니다. 원격 서버에서 오류를 반환했습니다. (404) 찾을 수 없습니다.

도움이된다면 크게 감사하겠습니다.

답변

0

문제는 라우팅 문제처럼 보입니다. 나는 here 찾을 수있는 RouteDebugger 함께 시작할 것입니다. 이 도구를 사용하면 URL이 어떤 경로에 도착하는지 알 수 있습니다.

HTTP GET에 사용하는 코드는 위와 다른 코드입니다. 아래에 포함되어 있습니다.

public T Get<T>(string url) 
    { 
     try 
     { 
      HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 

      using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created) 
       { 
        throw new HttpException((int)response.StatusCode, response.StatusDescription); 
       } 

       var end = string.Empty; 
       using (StreamReader reader = new StreamReader(responseStream)) 
       { 
        end = reader.ReadToEnd(); 
        reader.Close(); 
       } 

       responseStream.Close(); 
       response.Close(); 

       JsonSerializer serializer = new JsonSerializer(); 
       serializer.Binder = new DefaultSerializationBinder(); 
       JsonReader jsonReader = new JsonTextReader(new StringReader(end)); 
       T deserialize = serializer.Deserialize<T>(jsonReader); 

       return deserialize; 
      } 

     } 
     catch (Exception ex) 
     { 
      throw new ApiException(string.Format("An error occured while trying to contact the API. URL: {0}", url), ex); 
     } 
    } 

다른 문제는 GetScientificFocusAreas()입니다. 코드의 두 번째 줄에서 객체는 JSON으로 변환됩니다. 어느 쪽이 좋을지 모르지만 json 코드의 마지막 줄은 Json() 메서드로 전달됩니다. 이 문자열을 다시 Json으로 변환합니다. JSON.Net 라이브러리 대신 Json()return에서 Content() 방법을 사용 애플리케이션/JSON

내부 컨버터보다는 외부 JSON 변환기를 사용하는 추론 콘텐츠 유형을 설정 사용시 간단히 내부 JSON이고 변환기에는 몇 가지 알려진 문제가 있습니다. JSON.Net은 수년간 계속되어 왔으며 견고합니다.

+0

제안을 구현하려고하는데이 줄에 오류가 있습니다 ... serializer.Binder = new DefaultSerializationBinder(); 네임 스페이스 또는 클래스가 누락 되었습니까? System; using System.Collections.Generic; using System.Web; using System.Web.Routing; using System.Web.Mvc; using System.IO; using System.Collections; using System.Net; using System.Text; Newtonsoft.Json을 사용하는 ; –

+0

나의 마지막 코멘트를 무시하십시오 척, 나는 그것을 작동시킬 수있었습니다. serializer.Binder = 새로운 DefaultSerializationBinder(); –

+1

도와 줘서 고마워 척! –