我需要将文件从我的应用程序上传到我的 ASP.NET WEB API 后端。相同的 HTTP POST 请求已通过身份验证。通常我用 HTTPWEBREQUEST 类做这样的帖子。并将令牌添加到请求标头中request.Headers.Set(HttpRequestHeader.Authorization,"Bearer "+ token);
现在我需要在后台服务中做同样的事情,因为我不希望用户等待加载屏幕直到传输完成。我第一次尝试在 ios 中做背景。因为我的目标是 IOS 7 以上的设备,所以我知道我应该通过实现 NSUrlSession 来使用 BackGround Transfer Service。我检查了示例并找到了一个使用 NSUrlSessionDownloadTask 下载文件的示例。它类似于我们使用 Webclient 类直接从其 URL 下载文件的方式。我也知道有 NSUrlSessionUploadTask 用于上传文件。但是找不到一个实现,我可以使用 NSUrlSessionUploadTask 发布我的自定义 JSON,其中包括我的上传文件作为字节数组。我只熟悉使用 HTTPWEBREQUEST 和 WEBCLIENT。
这是我尝试过的
我试图通过在背景示例和 obj-c NSMutableURLRequest POST 示例中参考 monotouch 下载来实现这一点。
var jsonstr = JsonConvert.SerializeObject(imgvm);
byte[] bytes = Encoding.UTF8.GetBytes(jsonstr);
NSUrlSession session = null;
NSUrlSessionConfiguration configuration = NSUrlSessionConfiguration.BackgroundSessionConfiguration ("com.KeepCard.BackgroundSession");
session = NSUrlSession.FromConfiguration (configuration, (NSUrlSessionDelegate) new MySessionDelegate(), new NSOperationQueue());
const string UploadURLString = "**************";
NSUrlSessionUploadTask uploadTask;
NSUrl uploadURL = NSUrl.FromString (UploadURLString);
NSMutableUrlRequest requests = new NSMutableUrlRequest (uploadURL);
requests.HttpMethod="POST";
NSData bodyData = NSData.FromArray(bytes);
Dictionary<string,string> nsmd = new Dictionary<string, string> ();
nsmd.Add("Content-Type","application/json");
nsmd.Add("Content-Length",bytes.Length.ToString());
nsmd.Add("Authorization","Bearer "+token);
// nsmd.Add("Accept","*/*");
foreach (var header in nsmd)
{
requests[header.Key] = header.Value;
}
uploadTask = session.CreateUploadTask (requests);
imgvm 是视图模型,jsonstr 是要发布的 JsonString。这是我的 NSUrlSessionTaskDelegate
public class MySessionDelegate : NSUrlSessionTaskDelegate
{
public override void DidFinishEventsForBackgroundSession (NSUrlSession session)
{
var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
// Handle new information, update UI, etc.
// call completion handler when you're done
if (appDelegate.backgroundSessionCompletionHandler != null) {
NSAction handler = appDelegate.backgroundSessionCompletionHandler;
appDelegate.backgroundSessionCompletionHandler = null;
handler.Invoke ();
}
}
public override void DidReceiveChallenge (NSUrlSession session, NSUrlAuthenticationChallenge challenge, Action<NSUrlSessionAuthChallengeDisposition, NSUrlCredential> completionHandler)
{
Console.WriteLine ("Check Here");
}
public override void DidReceiveChallenge (NSUrlSession session, NSUrlSessionTask task, NSUrlAuthenticationChallenge challenge, Action<NSUrlSessionAuthChallengeDisposition, NSUrlCredential> completionHandler)
{
Console.WriteLine ("Check Here");
}
public override void DidBecomeInvalid (NSUrlSession session, NSError error)
{
Console.WriteLine ("Check Here");
}
public override void DidCompleteWithError (NSUrlSession session, NSUrlSessionTask task, NSError error)
{
Console.WriteLine ("Check Here");
}
}
我的 AppDelegate 中也有这些
public override void HandleEventsForBackgroundUrl (UIApplication application, string sessionIdentifier, NSAction completionHandler)
{
this.backgroundSessionCompletionHandler = completionHandler;
}
请指出我做错了什么。我必须在 info.plist 中启用后台模式吗?我没有启用,因为指定的模式都不匹配“后台传输服务。当我现在运行时,执行到 session.CreateUploadTask (requests); 然后应用程序停止,没有任何异常