2013-05-21 3 views
4

많은 주제가 있었지만 불행히도 각 사례마다 다른 케이스 (또는 대부분)가 있다고 생각합니다. 다른 주제를 통해 읽은 후에도 코드 작업을 수행 할 수 없으므로 필자는 특히 내 사례에 대한 전문가 의견을 정말 좋아할 것입니다.Ajax 요청시 오류 메시지가 표시되는 "형식이 없습니다."라는 메시지가 나타납니다.

상황 : MVC 4 응용 프로그램과 함께 WebApi 프로젝트에서 만든 WebService 메서드에 jQuery에서 Ajax 요청 호출을 사용하고 있습니다.

내 WebService에 컨트롤러 클래스는 다음과 같이 기본과 같습니다

public class AdditionalInfoController : ApiController 
{ 
    //GET api/AdditionalInfo 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    //GET api/AdditionalInfo/5 
    public string Get(int id) 
    { 
     return "value"; 
    } 

    //PUT api/AdditionalInfo/5 
    public void Put(int id) 
    { 
     string test = ""; 
    } 
} 

jQuery를에서 내 아약스 요청은 다음과 같습니다

내 WebAPIConfig 파일은 다음과 같습니다
function GetAdditionalInfo(obj) 
{ 
    var request = jQuery.ajax({ 
     url: "/api/AdditionalInfo/Get", 
     type: "GET", 
     data: { id: obj.id }, 
     datatype: "json", 
     async: false, 
     beforeSend: function() { 
     }, 
     complete: function() { 
     } 
    }) 
    .done(function (a,b,c) { 
     alert("Additional info was retrieved successfully!"); 
    }) 
    .fail(function (a,b,c) { 
     alert("An error happened while trying to get the additional info!"); 
    }); 
} 

:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

마지막으로, 내 문제입니다.이 오류 메시지는 다음과 같은 경우에 계속 나타납니다. 나는 .fail에서 반환 된 데이터 변수를 검색하고이 기록 된 것입니다 :

"{ 
    "Message":"No HTTP resource was found that matches the request URI  'http://localhost:59096/api/AdditionalInfo/Get?id=1'.", 
    "MessageDetail":"No type was found that matches the controller named 'AdditionalInfo'." 
}" 

사람이 가능한 한 빨리 나를 도울 수 있다면 나는 그것을 감사 정말 것이다. 미리 감사드립니다! 웹 API는 제어기 '형태'AdditionalInfo를 찾을 수 없습니다처럼 미친

답변

2

좋아, 그래서 나는 무슨 일이 일어나고 있는지 알았어. 나는 완전히 확신 할 수는 없지만 적어도 내 문제는 해결되었습니다.

Ajax 호출에서 "데이터"필드의 내용을 변경하는 것만으로 전체 데이터를 보유 할 응용 프로그램의 객체 클래스를 만들었습니다. 어떤 이유로이 메소드는 "Get (int ID)"구문을 가질 수 없습니다.

대신 "Get (object)"과 같은 Ajax 요청에서 "data : obj.ID"와 같은 형식으로 작업했습니다.

또한 프레임 워크는 REST 메서드 (Get, Post, Put 및 Delete)의 이름이 까다롭기 때문에 메서드의 이름을 Retrieve 또는 다른 것으로 변경했습니다.

앞으로 도움이 될 수 있기를 바랍니다.

안부,
미친

11


오류를 보면

안부, 보인다. 웹 API는 어셈블리 리졸버를 사용하여 어셈블리를 스캔하고 컨트롤러 유형을 찾습니다. 귀하의 경우에는 'AddInfo'컨트롤러를 찾을 수 없습니다. 컨트롤러가있는 어셈블리를로드하는 데 문제가있을 수 있습니다.

다음을 시도해보고 EventLog에 오류가 기록되어 있는지 확인하십시오. 오류를 발견하면 컨트롤러가 해당 어셈블리에 있는지 확인해야합니다.

  • 다음을 수행 할 수있는 Web.config에 다음 변경은 EventLog에 WebApiConfig.cs에서

    <system.diagnostics> <trace autoflush="false" indentsize="4"> <listeners> <add name="myListener" type="System.Diagnostics.EventLogTraceListener" initializeData="WebApiDiagnostics" /> </listeners> </trace> </system.diagnostics>

  • 을 오류를 확인하십시오 : BTW

    IAssembliesResolver assembliesResolver = config.Services.GetAssembliesResolver(); 
    
        ICollection<Assembly> assemblies = assembliesResolver.GetAssemblies(); 
    
        StringBuilder errorsBuilder = new StringBuilder(); 
    
        foreach (Assembly assembly in assemblies) 
        { 
         Type[] exportedTypes = null; 
         if (assembly == null || assembly.IsDynamic) 
         { 
          // can't call GetExportedTypes on a dynamic assembly 
          continue; 
         } 
    
         try 
         { 
          exportedTypes = assembly.GetExportedTypes(); 
         } 
         catch (ReflectionTypeLoadException ex) 
         { 
          exportedTypes = ex.Types; 
         } 
         catch (Exception ex) 
         { 
          errorsBuilder.AppendLine(ex.ToString()); 
         } 
        } 
    
        if (errorsBuilder.Length > 0) 
        { 
         //Log errors into Event Log 
         Trace.TraceError(errorsBuilder.ToString()); 
        } 
    

    을 , 위의 코드 중 일부는 실제로 웹 API가 컨트롤러 유형을 확인하는 데 사용하는 DefaultHttpControllerTypesResolver에서 온 것입니다. http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http/Dispatcher/DefaultHttpControllerTypeResolver.cs

을 편집 : 컨트롤러가 다른 클래스 내부 중첩 경우이 문제를 칠 수 또 하나 개의 시나리오입니다. 이것은 나중에 수정 된 버그였습니다.

+0

감사합니다. Kiran, 내가 제공 한 코드를 복사하고, 무엇이라도 알아낼 수 있는지 확인합니다. 그러나 코드가 있고 애플리케이션을 실행하면 추적을 정확히 볼 수있는 위치는 어디입니까? 이전 직장에서 추적을 사용 했었지만 지금 당장 어떻게해야하는지 기억이 안납니다. 다시 한번 감사드립니다! – MadGatsu

+0

EventViewer의 응용 프로그램 이벤트 로그 원본을 확인할 수 있습니다. 범주는 WebApiDiagnostics 여야합니다. –

+0

감사합니다. Kiran하지만 당신이 말한대로 할 수 없었습니다. 전에 EventViewer 나 WebApiDiagnostics에 대해 들어 본 적이 없기 때문에 나는 당신의 마지막 코멘트를 해독 할 수 없었습니다. Google 검색은 열매 맺지 않았습니다. 나는 내 문제를 해결했지만, 나는 그 대답을 다음에 게시 할 것이다. 건배! – MadGatsu

0

당신이 당신의 방법에서 (INT ID)를 같은 매개 변수 이름이 있는지 확인뿐만 아니라 WebApiConfig/RouteConfig있다.

public string Get(int? id = null) 
{ 
    return "hello"; 
} 
+0

통찰력에 감사드립니다. 그러나 입력 매개 변수를 nullable로 변경하여 문제를 해결하는 방법은 무엇입니까? – MadGatsu

+0

문제를 해결할 수는 없지만 매개 변수가 문제의 원인임을 알면 도움이됩니다. (매개 변수가 WebApiconfig에서와 같지 않기 때문에 정확히 같은 오류가 발생했습니다.) – enigma969

0

public string Get(int id) 
{ 
    return "hello"; 
} 

를 변경하여 시도 저도 같은 문제가 있었다. 저와 함께 그것은 Visual Studio (2012)의 호감으로 인해 발생합니다. Visual Studio에서 컨트롤러 파일을 열어 보았지만 솔루션에 포함되지 않았습니다. 솔루션 탐색기의 컨트롤러 디렉토리에서 찾을 수 없습니다.

방금 ​​컨트롤러 디렉토리 => 추가 => 기존 항목을 마우스 오른쪽 버튼으로 클릭하여 솔루션에 파일을 추가했습니다.

나를 위해 문제가 해결되었습니다.

컨트롤러를 삭제하고 동일한 코드로 새 컨트롤러를 추가하려고하면 작동하지 않는 것일 수 있습니다. . .

관련 문제