Frage

Ich habe diesen Code auf meinem Server hier (Ja ich bekannt ASMX ist eine schlechte Idee, aber WCF überhaupt aus irgendeinem Grund nicht funktioniert):

<%@ 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;
}

, wenn ich den folloing Code ausführen:

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

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

Ich erwarte, um wieder:

5
3

aber ich habe zurück

5
5

Meine Lösung

  1. usee wsdl.exe eine Proxy-Klasse
  2. zu erzeugen,
  3. Fügen Sie Verweise wie nötig, um es zu kompilieren zu bekommen
  4. Verwenden Sie Martin Lösung

Dies scheint im Zusammenhang

Edit:. Added-Zustand-Objekt

War es hilfreich?

Lösung

Web-Services sind staatenlos, so dass sie nicht speichern ihren Zustand zwischen mehreren Anrufen. Jedesmal, wenn man eine Methode aufrufen, eine neue Instanz des Dienstes erstellt werden und seine Mitglieder werden wieder die Standardwerte haben.

Was Sie tun können, ist der Sitzungsstatus zu ermöglichen (wie Sie getan haben) und speichern Sie Ihren Zustand in der ASP.NET-Sitzung.

So etwas wie folgt aus:

[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"]; }

Das war, was auf der Serverseite erforderlich ist. Aber Sie müssen auch auf der Client-Seite kümmern:

Da eine ASP.NET-Sitzung durch ein Cookie identifiziert wird, müssen Sie sicherstellen, dass Sie das gleiche Cookie an den Server mit jedem Web-Methodenaufruf übergeben. Um dies zu tun, müssen Sie einen Cookie instanziiert und weisen Sie auf die Web-Service-Proxy-Instanz:

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

Andere Tipps

Sie müssen sich auf Sitzungen machen.

[WebMethod(EnableSession = true)]

Es scheint mir, wie sein nicht-Klasse Zustand zwischen Sitzungsmethodenaufrufen persistierenden - wahrscheinlich ein neues Objekt wird jedes Mal aufgerufen wird. Ich bin eigentlich nicht sicher, dass Sie sich auf immer die gleiche Objektinstanz jedes Mal, wenn Sie den Service anrufen verlassen können. Joshuas Antwort ist richtig, aber Sie werden auch Code schreiben müssen Ihren Dienst internen Feld in dieser Sitzung zu bestehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top