Frage

Hier ist ein einfaches Beispiel, das angeblich „Hallo Welt“ string zurückzukehren. Allerdings zeigt ein Browser etwas wie SGVsbG8gV29ybGQ=. Welche ist die richtige Art und Weise Klartext von einem oldskul-Stil Service zurück?

Sie wissen, dass:

  1. Ich kann nicht einen String zurückgeben. Drei Unicode-Zeichen automatisch vorangestellt wird und das Erbe HTTP-Client wird nicht zusammenarbeiten können,

  2. Ich könnte eine Message zurückkehren, muss aber noch halten Funktionalität Parsen der data Variable zu extrahieren. Mischen Message und int Typen in der gleichen Methode Signatur AFAIK nicht erlaubt.

    [ServiceContract(SessionMode=SessionMode.NotAllowed)] 
    public interface IHello 
    {
      [WebGet(UriTemplate = "manager?data={data}")]
      [OperationContract]
      Byte[] DoIt(int data);
    }

    public class Hello : IHello { public Byte[] DoIt(int data) { return Encoding.ASCII.GetBytes("HelloWorld"); } }

UPDATE : Es ist nicht Kauderwelsch, aber richtig Antwort codiert. Allerdings ist das Format nicht, was ich erwarten würde, zu erhalten. Ich habe herausgefunden (wie Herren unten vorschlagen), dass die ultimative Kontrolle über die Transportschicht-Messaging-Format ist mit Message Klasse gewonnen. Wenn ich jedoch die Verwendung eines tun - Ich löse die Möglichkeit, den Antrag der Parsen (UriTemplate Attribut). Daher wäre es toll, zu wissen, wie die Message mit UriRequest zu integrieren.

P. S Wenn die „saubere“ Integration nicht möglich ist -. Als das, was die eleganteste Abhilfe ist? Gibt es einen Code, der hinter dem Draht Vorhang getan wird, dass ich in meiner Implementierung ausleihen und verwenden kann, bitte?

War es hilfreich?

Lösung 2

gegoogelt für eine richtige Art und Weise zu integrieren und fanden heraus, dass Menschen gerade stecken, wie ich bin (bitte korrigieren Sie mich, wenn ich das falsch bin). Bisher ist die folgende Lösung funktioniert gut für mich:

  public class Hello : IHello
  {
        [WebGet(UriTemplate = "manager")]
        [OperationContract]
        Message DoIt();
  }

  public class Hello : IHello
  {
        public Message DoIt()
        {
          var webContext = WebOperationContext.Current;
          var request = webContext.IncomingRequest;
          var queryParameters = request.UriTemplateMatch.QueryParameters;
          var data = queryParameters["data"];

          var result = new StringBuilder(@"
              <?xml version='1.0'?>
              ...
          ");

          var response = webContext.CreateTextResponse(result.ToString(), "application/xml", Encoding.ASCII);

          return response;
        }
  }

Wenn es eine bessere Alternative ist -. Es wäre perfekt, um es zu wissen,

Andere Tipps

Das ist nicht Kauderwelsch -. Es ist die Base64-codierte Version des ASCII für „Hallo Welt“ Bytes (mit Leerzeichen)

Wenn Sie einen Web-Service zu übertragen Bytes fragen, wird es base64 verwenden ... Ihr Web-Service-Client des base64 führt automatisch Dekodierung erhalten Sie das ursprüngliche Bytes zurück.

(Ich würde vorschlagen, nicht Encoding.ASCII verwenden, wohlgemerkt.)

Es ist nicht klar, was Ihr „legacy HTTP-Client“ ist, oder was es erwartet, so dass wir nicht wirklich sagen, ob ein Byte-Array Rückkehr ist eigentlich die beste Antwort oder nicht.

Die SOAP-Spezifikation besagt, dass rohe Binärdaten sollten Base64 codiert werden. So ist das Verhalten Sie Zeuge korrekt ist.

Wenn Sie auf Senden ASCII-Zeichendaten benötigen. Sie können einen Nachrichtenvertrag und eine rohe Nachricht verwenden.

Message DoIt(DoItRequest request)

Die rohe Meldung erstellen die Antwort ASCII-Daten enthält. Der Nachrichtenvertrag wird verwendet, um die int-Parameter abrufen Sie erwähnen:

[MessageContract]
public class DoItRequest
{
  [MessageBodyMember] public int data;
}

Dieses wird erläutert, wie die Arbeit mit der Nachrichtenklasse.

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