1

我需要将文件从我的应用程序上传到我的 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); 然后应用程序停止,没有任何异常

4

0 回答 0