문제

이 코드가 내 서버에 있습니다 여기 (예, ASMX를 알고있는 것은 나쁜 생각이지만 WCF는 어떤 이유로 든 전혀 작동하지 않습니다) :

<%@ WebService Language="C#" Class="Test" %>

using System.Web;
using System.Web.Services;

[WebService(Namespace = "http://smplsite.com/smplAccess")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Test : System.Web.Services.WebService
{
    State s;

    public Test()
    {
        s = (Session["foo"] ?? (Session["foo"] = new State())) as State ;
    }

    [WebMethod(EnableSession = true)]
    public void Set(int j) { i=j; }

    [WebMethod(EnableSession = true)]
    public int Get() { return i; }
}

class State
{
    public int i = 5;
}

folloing 코드를 실행할 때 :

class Program
{
    static void Main(string[] args)
    {
        var ser = new ServiceReference1.TestSoapClient();

        Console.WriteLine(ser.Get());
        ser.Set(3);
        Console.WriteLine(ser.Get());
    }
}

나는 돌아올 것으로 기대한다 :

5
3

그러나 나는 돌아왔다

5
5

내 해결책

  1. 사용 wsdl.exe 프록시 클래스를 생성합니다
  2. 컴파일하기 위해 필요에 따라 참조를 추가하십시오
  3. 사용 마틴 해결책

이것은 관련된 것 같습니다

편집 : 추가 상태 객체.

도움이 되었습니까?

해결책

웹 서비스는 상태가 없으므로 여러 통화 사이에 상태를 저장하지 않습니다. 메소드를 호출 할 때마다 새 서비스 인스턴스가 생성되고 멤버는 기본값을 다시 갖습니다.

당신이 할 수있는 것은 세션 상태를 활성화하고 (당신이 한 것처럼) ASP.NET 세션에 주 상태를 저장하는 것입니다.

이 같은:

[WebMethod(EnableSession = true)]
public void Set(int j) { Session["i"] = j; }

[WebMethod(EnableSession = true)]
public int Get() { return Session["i"] == null ? 5 : (int)Session["i"]; }

이것이 서버 측에서 필요한 것입니다. 그러나 클라이언트 측면에서도주의를 기울여야합니다.

ASP.NET 세션은 쿠키로 식별되므로 모든 웹 메소드 호출마다 동일한 쿠키를 서버에 전달해야합니다. 그렇게하려면 CookieContainer를 인스턴스화하고 웹 서비스 프록시 인스턴스에 할당해야합니다.

static void Main(string[] args)
{
    var ser = new ServiceReference1.TestSoapClient();
    ser.CookieContainer = new System.Net.CookieContainer();
    // ...
}

다른 팁

세션을 켜야합니다.

[WebMethod(EnableSession = true)]

세션 메소드 호출 사이에 클래스 상태가 지속되지 않는 것처럼 보입니다. 아마도 새로운 객체가 매번 호출되고있을 것입니다. 실제로 서비스를 호출 할 때마다 동일한 개체 인스턴스를 얻는 데 의존 할 수 있는지 확실하지 않습니다. Joshua의 답변은 정확하지만 서비스의 내부 필드를 해당 세션에 유지하려면 코드를 작성해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top