4 Stimmen

ServiceStack-Client-Anhang hinzufügen

Ich verwende ServiceStack.ServiceClient.Web.XmlServiceClient, um eine Verbindung zu einem Webservice herzustellen. Gibt es eine Möglichkeit, einen Anhang zur Anfrage hinzuzufügen?

Weitere Informationen:

Was ich versuche zu tun, ist die Verwendung von Microsoft.Web.Services2 zu vermeiden, da ich Mono verwende. Ich versuche, eine XML-Datendatei zusammen mit einer XML-Anfrage hochzuladen. Genau wie in dieser Frage: Berichtseinheit über Webservice in C# .NET an Jasperserver hochladen

15voto

mythz Punkte 138304

Um Dateien hochzuladen, ist der beste (und schnellste) Weg, sie nicht als normale Anfragevariable zu codieren, sondern sie einfach als normalen HTTP-Upload mit ContentType multipart/form-data hochzuladen, also so, wie HTML-Formulare derzeit Dateien an eine URL senden.

ServiceStack hat eine integrierte Unterstützung zum Verarbeiten hochgeladener Dateien auf diese Weise, wobei ein vollständiges Beispiel, wie dies im ServiceStack RestFiles Beispielprojekt durchgeführt wird.

Um Dateien mit dem ServiceClient hochzuladen, können Sie die .PostFile() Methode in diesem Beispiel verwenden:

var fileToUpload = new FileInfo(FilesRootDir + "TESTUPLOAD.txt");

var response = restClient.PostFile(WebServiceHostUrl + "files/README.txt",
    fileToUpload, MimeTypes.GetMimeType(fileToUpload.Name));

Alle hochgeladenen Dateien stehen in der base.RequestContext.Files Sammlung zur Verfügung, die Sie einfach mit der SaveTo() Methode verarbeiten können (entweder als Stream oder als Datei).

foreach (var uploadedFile in base.RequestContext.Files)
{
    var newFilePath = Path.Combine(targetDir.FullName, uploadedFile.FileName);
    uploadedFile.SaveTo(newFilePath);
}

Ähnlich in Bezug auf die Rückgabe einer Dateiantwort (entweder als Anhang oder direkt) müssen Sie einfach die FileInfo in einem HttpResult zurückgeben:

return new HttpResult(FileInfo, asAttachment:true);

Mehrere Datei-Uploads

Sie können auch die PostFilesWithRequest APIs verwenden, die in allen .NET Service-Clients verfügbar sind, um mehrere Streams in einer einzelnen HTTP-Anfrage hochzuladen. Es unterstützt das Befüllen des Anforderungs-DTO mit einer beliebigen Kombination von QueryString und übermittelten FormData sowie mehreren Dateiupload-Datenströmen, z.B.:

using (var stream1 = uploadFile1.OpenRead())
using (var stream2 = uploadFile2.OpenRead())
{
    var client = new JsonServiceClient(baseUrl);
    var response = client.PostFilesWithRequest(
        "/multi-fileuploads?CustomerId=123",
        new MultipleFileUpload { CustomerName = "Foo,Bar" },
        new[] {
            new UploadFile("upload1.png", stream1),
            new UploadFile("upload2.png", stream2),
        });
}

Beispiel für die Verwendung nur eines typisierten Anforderungs-DTOs. Der JsonHttpClient enthält auch asynchrone Entsprechungen für jede der PostFilesWithRequest APIs:

using (var stream1 = uploadFile1.OpenRead())
using (var stream2 = uploadFile2.OpenRead())
{
    var client = new JsonHttpClient(baseUrl);
    var response = await client.PostFilesWithRequestAsync(
        new MultipleFileUpload { CustomerId = 123, CustomerName = "Foo,Bar" },
        new[] {
            new UploadFile("upload1.png", stream1),
            new UploadFile("upload2.png", stream2),
        });
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X