2009-08-05 4 views
0

'상태가 좋은 서비스가 좋지 않습니다'토론에 들어 가지 않고 ... 어떻게 작성하나요?asp.net에서 stateful XML WebService를 만드는 방법은 무엇입니까?

도움이되는 검색 결과가 부족합니다. 잘못된 용어를 찾고 있거나 적극적으로 낙담하고있는 것 같습니다. 내가 찾을 수있는 최고의 링크는 this one on MSDN

현재 사용중인 앱의 간단한 컨텍스트를 제공합니다. Rails Web App => ASP.Net Xml webservice => Legacy C#/C++ code

지금까지 그렇게 좋았습니다. 이제는 WebMethod에 대한 첫 번째 요청을 할 때 각 호출에서 생성 - 사용 - 처리 비용이 많이 드는 프로세스/리소스를 실행해야합니다. 그래서 나는이 자원들을 재사용하는 것을 보았습니다.

먼저 구성원 변수로 만들려고했는데 - 각 요청에 MyWebService 클래스의 새 인스턴스가 적용되고 다른 스레드에서 서비스가 제공되는 전구 만 있습니다.

링크는이 작업을 수행 할 수있는 방법은

  • 가 상태가 당 사용자 인 경우에 세션 해시/속성 모음을 사용하는 것이 좋습니다.

    1. 이 권리인가 :
    2. 는 상태가

질문 전역 경우 응용 프로그램 해시/속성 모음을 사용 하는가? 마법 속성이 부족합니까?

  • 나는 응용 프로그램 해시 테이블 방법을 시도했다 ... 첫 번째 요청에서 특정 알려진 키를 채 웁니다. 그러나 두 번째 요청에서 해시 테이블은 깨끗한/항목 없음 상태에 있습니다.
  • 어떻게 동기화를 처리합니까? 전용 멤버 개체에 대한 .net 잠금 방법이 작동하지 않습니다.
  • 내 웹 서비스 클래스는 다음과 같습니다 ..

    [WebService(Namespace = "http://Walkthrough/XmlWebServices/", 
         Description="A temperature conversion xml web service")] 
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
        [System.ComponentModel.ToolboxItem(false)] 
    
        public class TemperatureConverter : System.Web.Services.WebService, IDisposable 
        { 
         [WebMethod(Description = "This method converts celsius to fahrenheit")] 
         public double convert_fahrenheit_to_celsius(double temp_in_fahrenheit) 
         { 
         /// code 
         } 
        } 
    

    업데이트 : 난 아직도 Q # 2와 사투를 벌인거야. 은 "사용자 이름"키를 쓰기에 성공

    protected void Application_Start(object sender, EventArgs e) // global.asax.cs 
    { 
         Application["UserName"] = "Gishu"; 
    } 
    
    myWebMethod // MyWebService.cs 
    { 
        if (Application["myKey"] == null) 
        LoadHeavyObjectsAndCacheKeys(); // set Application["myKey"] between Application.Lock() Unlock() calls. 
        ... 
    } 
    

    몇 가지 이상한 행동을있다 - 그것은 해시에 존재한다. 그러나 웹 메서드 내에서 작성한 키 - 값 쌍은 현재 웹 요청에서 살아남지 못합니다. 다음 요청에서 해시 테이블에는 여전히 "UserName"항목 만 있습니다. 이것이 ApplicationState이기 때문에 EnableSession 속성을 true로 설정하지 않아도된다고 가정합니다.

    답변

    1

    예. 세션 당 데이터에는 Session 상태를 사용해야하고 응용 프로그램 차원 데이터에는 Application 상태를 사용해야합니다.

    웹 서비스 작업에 [WebMethod(EnableSession=true)] 속성이 있어야합니다.

    +0

    확인해 주셔서 감사합니다. 그러나 응용 프로그램 상태가 계속 유지되는 데 문제가 있습니다. 내 질문에 대한 업데이트를 참조하십시오. 또한 ASP.Net 개발 서버를 실행 중입니다.이 문제가 발생할 수 있습니까? – Gishu

    +0

    디버그 전략으로 단순화 할 것을 제안합니다. Application_Start에서 웹 메소드로 코드를 복사 한 다음 키를 "Username1"로 변경하십시오.두 번째로 웹 메소드를 호출 할 때 _this_ 셀이 초기화되었는지 확인하십시오. –

    관련 문제