Быстрая загрузка файла через WCF

Я боролся с этим более 10 часов и приложил все усилия, прежде чем приехать сюда. Многие учебные пособия, которые я просмотрел, в конечном итоге были устаревшими на одну или две версии и / или отсутствовали некоторые ключевые знания в объяснении.

Я пытаюсь загрузить PDF-файл на сервер с помощью службы WCF Rest. Когда я отлаживаю службу WCF, переменная с именем document является нулевым потоком. Я искал в Интернете много часов, пробуя много разных вещей, и я исчерпал МНОГИЕ попытки заставить такую ​​мелочь работать! Что действительно раздражает, так это то, что это не первый раз, когда кому-то это нужно, и все же я нигде не нашел ответа.

Если есть лучший способ опубликовать PDF-файл, отличный от того, что я опубликовал, я открыт для предложений, но я не хочу использовать сторонние фреймворки.

Требования: - Требуется использование службы WCF - Я не сохраняю в файловую систему или UNC

Мне нужно получить действительный поток памяти, переданный службе, и я могу позаботиться о коде функции оттуда. Я пробовал использовать Base64DataString до этого, и я тоже мог заставить это работать. Если вы хотите предоставить это как вариант, я открыт для этого.

Пожалуйста помоги!

Код Swift 4:

импортировать PDFKit

class FileUpload {

    static func generateBoundaryString() -> String {
        return "Boundary-\(UUID().uuidString)"
    }

    static func dataUploadBodyWithParameters(_ parameters: [String: Any]?, filename: String, mimetype: String, dataKey: String, data: Data, boundary: String) -> Data {
        var body = Data()
        // encode parameters first
        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString("\(value)\r\n")
            }
        }

        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name=\"\(dataKey)\"; filename=\"\(filename)\"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.append(data)
        body.appendString("\r\n")
        body.appendString("--\(boundary)--\r\n")
        print(body)
        return body
    }

    static func uploadData(_ data: Data, toURL urlString: String, withFileKey fileKey: String, completion: ((_ success: Bool, _ result: Any?) -> Void)?) {
        if let url = URL(string: urlString) {
            // build request
            let boundary = generateBoundaryString()
            var request = URLRequest(url: url)

            request.httpMethod = "POST"
            request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
            request.setValue("application/json", forHTTPHeaderField: "Accept")

            // build body
            let body = dataUploadBodyWithParameters(nil, filename: "iOSUpload.pdf", mimetype: "application/pdf", dataKey: fileKey, data: data, boundary: boundary)
            request.httpBody = body

            //UIApplication.shared.isNetworkActivityIndicatorVisible = true
            URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) -> Void in
                if data != nil && error == nil {
                    do {
                        let result = try JSONSerialization.jsonObject(with: data!, options: [])
                        print(result)
                        DispatchQueue.main.async(execute: { completion?(true, result) })
                    } catch {
                        DispatchQueue.main.async(execute: { completion?(false, nil) })
                    }
                } else { DispatchQueue.main.async(execute: { completion?(false, nil) }) }
                //UIApplication.shared.isNetworkActivityIndicatorVisible = false
            }).resume()
        } else { DispatchQueue.main.async(execute: { completion?(false, nil) }) }
    }

}

extension Data {
    mutating func appendString(_ string: String) {
        let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
        append(data!)
    }
}

}

Соответствующий код WCF:

<ServiceContract>
Public Interface IWebService

<OperationContract>
    <WebInvoke(Method: = "POST", UriTemplate: = "UploadFile/{fileName}")>
    Function UploadFile(fileName As String, document As Stream) As String

End Interface

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single)>
Public Class MyWebService : Implements IWebService

Public Function UploadFile(fileName As String, document As Stream) As String Implements IWebService.UploadFile
        'document is null
End Function

Я плохо разбираюсь в настройке WCF. Итак, скажите, пожалуйста, действительно ли ваша служба WCF Rest принимает multipart/form-data? Вы подтвердили это с помощью такого инструмента, как Postman?

OOPer 25.03.2018 06:10

Я, наверное, могу вынуть multipart / form-data. Эта часть была из учебника.

bwhite 25.03.2018 06:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
79
0

Другие вопросы по теме