Я боролся с этим более 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
Я, наверное, могу вынуть multipart / form-data. Эта часть была из учебника.





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