Frage

Ich erstelle eine RestSharp.RestRequest über:

RestRequest request = new RestRequest();
request.Method = Method.POST;
request.Resource = "/rest-uri";

request.AddHeader("Content-Type", "application/someContentType");

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + Environment.NewLine +
             "<register-request">" + Environment.NewLine +
             "    <name=\"someName\"/>" + Environment.NewLine +
             "</register-request>");

request.AddParameter("text/xml", registerSinkRequest, ParameterType.RequestBody);

(Der Inhaltstyp wird manuell auf eingestellt application/someContentType)

Im Debug-Modus wird es auch angezeigt Content-Type=application/someContentType

Aber die Ausführung von RestRequest gibt eine zurück 415 Media Not Supported-Error und WireShark zeigen an, dass der Medientyp auf eingestellt ist text/xml (wie in der AddParameter-Methode gesetzt).

Warum zeigt RestSharp einen anderen Inhaltstyp an als WireShark?Und wie kann ich verhindern, dass der Inhaltstyp geändert wird (falls vorhanden)?

War es hilfreich?

Lösung

Svicks Kommentar ist richtig.Legen Sie den Inhaltstyp im ersten Parameter von fest AddParameter() und Sie können das weglassen AddHeader() Anruf.

Das ist zwar die „richtige“ Antwort, aber ich werde erklären, warum es dafür eine verwirrende Methode gibt, die nicht ganz offensichtlich ist.

Der beabsichtigte Weg, dies zu erreichen, ist die Verwendung AddBody() zusammen mit RestRequest.RequestFormat.Ein Beispiel:

var client = new RestClient();
// client.XmlSerializer = new XmlSerializer(); // default
// client.XmlSerializer = new SuperXmlSerializer(); // can override with any implementaiton of ISerializer

var request = new RestRequest();
request.RequestFormat = DataFormat.Xml;
request.AddBody(objectToSerialize);

Die Serialisierung von objectToSerialize basiert auf der registrierten XmlSerializer.Wenn du benutzt RequestFormat = DataFormat.Json, dann ist die RestClient.JsonSerializer wird eingesetzt.Implementierungen von ISerializer (mit der Sie die Standardserialisierung überschreiben können) deklarieren ihre eigenen Inhaltstypen, die durch den Janky weitergeleitet werden AddParameter() Überlastung, die Sie verwenden.

AddParameter(contentType, content, ParameterType.RequestBody) war nie dazu gedacht, direkt aufgerufen zu werden.Es wurde als Workaround für die Weiterleitung von Daten hinzugefügt AddBody() Aber dann wurden andere Dinge davon abhängig, sodass es bestehen blieb.Im Nachhinein war es eine schreckliche Entscheidung, aber es ist zu spät, sie in der 1xx-Version zu ändern.Wenn ich jemals eine weitere Version baue, werde ich dies deutlicher machen.

Andere Tipps

Es ist möglich, den Inhaltstyp zu ändern, wenn Sie den Hauptinhalt festlegen.Der NAME-Parameter für Body legt den Content-Type fest.

oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody });
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top