이것이 이런 식으로 작동해야합니까?
-
03-07-2019 - |
문제
이 코드가 내 서버에 있습니다 여기 (예, 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
내 해결책
- 사용
wsdl.exe
프록시 클래스를 생성합니다 - 컴파일하기 위해 필요에 따라 참조를 추가하십시오
- 사용 마틴 해결책
편집 : 추가 상태 객체.
해결책
웹 서비스는 상태가 없으므로 여러 통화 사이에 상태를 저장하지 않습니다. 메소드를 호출 할 때마다 새 서비스 인스턴스가 생성되고 멤버는 기본값을 다시 갖습니다.
당신이 할 수있는 것은 세션 상태를 활성화하고 (당신이 한 것처럼) 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의 답변은 정확하지만 서비스의 내부 필드를 해당 세션에 유지하려면 코드를 작성해야합니다.
제휴하지 않습니다 StackOverflow