2012-04-01 4 views
4

asp.net asmx 서비스가 있고 wcf 서비스로 변환하고 싶습니다.ASMX 서비스를 WCF 서비스로 마이그레이션 - AJAX 게시

매개 변수가있는 jquery ajax POST 요청에서 wcf 서비스를 호출하는 데 문제가 있습니다.

매개 변수없이 WCF 서비스를 호출하거나 매개 변수를 json 형식으로 전달하면 정상적으로 작동합니다. WCF 서비스에 아래 JQuery와 게시물을 실행할 때

은 내가 JQuery와 요청이 방식을 변경할 수 없습니다, 오류 500

있습니다 얻을.

원래 ASMX 서비스 :

[WebMethod(EnableSession = true)] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public void SendStatus(string param1, string param2) 
{ 
.................. 
} 

jQuery를 POST :

var d = { param1: 1, param2: 2 }; 
     $.ajax({ 
      type: "POST", 
      url: "/Service1.asmx/SendStatus", 
      data: d, 
      success: function() { } 
     }); 

NEW WCF 서비스 :

[OperationContract] 
[WebInvoke] 

public void SendStatus(string param1, string param2) 
{ 
} 

jQuery를 POST :

var d = { param1: 1, param2: 2 }; 
$.ajax({ 
      type: "POST", 
      url: "/Service2.svc/SendStatus", 
      data: d, 
      success: function() { } 
     }); 
+0

내 편집 논평 - WCF보다 요청 경로를 구성하는 것이 훨씬 쉬운 MVC3을 사용하는 것이 좋습니다. 나는 WCF의 유연성에 압도 당했을뿐 아니라 구성의 비 관성에 압도 당했다. (더 진보 된 네트워크 설정에 좋을 듯). – McGarnagle

+0

MVC는 좋지만 이미 웹 양식의 기존 프로젝트가 있습니다. – RuSh

답변

2

- EDIT - 나는이 문제가 전에 한번도 견과를 몰아 부쳤다는 것을 기억한다. 그래서 나는 다른 모습으로 돌아갔다. 물론 ... Javscript가 작성된 상태로 유지된다는 요구 사항을 감안할 때 현재 버전의 WCF에서는 문자 그대로 불가능하다고 계속 주장합니다. 다음 사항을 고려하십시오.

1) REST 스타일 서비스 (basicHttpBinding 및 WSHttpBinding 둘 다 SOAP 래퍼 사용)를 지원하는 유일한 바인딩이기 때문에 webHttpBinding을 사용해야합니다. (참조 : 여기에 : BasicHttpBinding vs WsHttpBinding vs WebHttpBinding)

2)이 질문에 쓰여진 AJAX 호출은 "application/x-www-form-urlencoded"의 콘텐츠 유형을 사용합니다 (Fiddler를 사용하여이를 확인할 수 있습니다).

3) 서비스 메소드가 호출되기 전에 WCF가 예외를 throw하는지 확인할 수도 있습니다. 예외는 다음과 같습니다.

'Bare'는 'WebScriptEnablingBehavior'에서 지원하지 않습니다. 바디 스타일을 'WrappedRequest'로 변경하십시오.

하지만 "베어 형"본문 스타일은 Microsoft에서 기본 매개 변수 (예 : JSON 또는 XML로 래핑되지 않음)를 사용하여 REST 요청을 말합니다. 즉, WCF가이 특정 AJAX 요청을 처리 할 수있는 구성이 없습니다. 자신 만의 WebContentTypeMapper를 구현할 수도 있으며 여전히 작동하지 않습니다. 이 사람은 그들에게있다 : http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2473190-consider-making-the-system-servicemodel-channels-r

나의 결론은 (당신이 케이크 한 조각이 될 MVC를 사용할 수 없다면) 어떻게 든이 요청을 기본 .ASPX 페이지로 라우트해야한다는 것이다. 신뢰할 수있는 이전 Webforms 메서드 (Page.IsPostBack, Request.Params [ "param1"] 등)를 사용하십시오.- END 편집 -

당신이 AJAX 호출에서/수정을 추가 할 필요가 몇 가지 매개 변수가 같은 위의 다른 스레드 당

은 보인다 :

... 
dataType: 'json', 
contentType: 'application/json; charset=utf-8', 
data: JSON.stringify(d) 
... 
+0

매개 변수를 json으로 변경하고 싶지 않습니다. 나는 아약스 코드를 그대로두고 ajax와 일치하도록 wcf 서비스를 변경해야한다. – RuSh

+0

@sharru gotcha. 그 점을 강조하기 위해 귀하의 질문을 편집 하시겠습니까? 만족스런 대답을 얻지 못하면 RequestFormat과 같은 WebInvoke의 속성을 시험해 보겠습니다. http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute_properties.aspx. – McGarnagle

+0

1. 귀하의 의견에 감사드립니다. 나는 그것을 굵은 글씨로 강조했다. :) 2.i는 WebInvoke로 실험을했는데 작동하는 것을 찾을 수 없었다 .. – RuSh

0

가 나는 당신이 생각 이중 따옴표 ("")로 문자열 매개 변수 값을 전달하십시오. 좋아요 :

var d = { param1: "1", param2: "2" }; 
    $.ajax({ 
       type: "POST", 
       url: "/Service2.svc/SendStatus", 
       data: d, 
       success: function() { } 
      }); 

희망이 있습니다.

500 오류 코드는 매개 변수 값이 필수 값과 일치하지 않는다는 것을 의미합니다.

1

클라이언트 측 코드를 변경할 수 없으면 이 아니고이 끝점을 ASMX에서 WCF로 마이그레이션해야합니다. WCF는 ASMX와는 다른 유연성이 적은 시리얼 라이저를 사용하기 때문에 클라이언트 쪽에서 데이터를 보내고 받고, 처리하는 방법을 변경해야만 문제가 해결 될 수 있습니다.

어쨌든 이러한 혼란에 대처하고자한다면 ASP.NET 웹 API가 제공되어 이동 될 때까지 훨씬 더 나은 마이그레이션 경로가 기다리고있을 것입니다. 현재 WCF로 이동하면 올해 말에 Web API가 출시 될 때 다시 뒤처 질 것입니다.

관련 문제