我正在构建一个 NSUrlSession,如下所示:
NSUrlSessionConfiguration sessionCfg = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration("mySpecialSessionName");
NSUrlSessionDelegate sessionDelegate = new MySessionDelegate();
urlSession = NSUrlSession.FromConfiguration(sessionCfg, sessionDelegate, NSOperationQueue.MainQueue);
并使用自定义 HTTP header 调用后台下载:
NSMutableUrlRequest mutableRequest = new NSMutableUrlRequest();
mutableRequest.HttpMethod = "POST";
mutableRequest.Url = NSUrl.FromString(someEndpoint);
mutableRequest["MyCustomHeader"] = someStringWithUnicodeChars;
mutableRequest.Body = NSData.FromString(somePostBody);
NSUrlSessionDownloadTask downloadTask = m_UrlSession.CreateDownloadTask(mutableRequest);
downloadTask.Resume();
但是, header 值字符串似乎在 255 以上的第一个字符处被截断。例如, header 值:
SupeЯ Σario Bros
被服务器接收为
Supe
当改为在 xamarin 上使用 .NET HttpClient 时,unicode header 字符串成功地使其未被修改地发送到服务器。但是,我想利用 NSUrlSession 的后台下载功能。
(我意识到 HTTP header 中对 unicode 的支持是偶然的,但由于在这种情况下 HTTP 服务器是一个特定的自定义服务器,目前不支持 base64 编码之类的东西,因此需要传递原始字符串)
最佳答案
我不知道你是否能够完成这项工作,但我想到了两件事:
- 此处的内容等同于在 URL 请求上调用 setValue:forKey:。我认为这不会达到您的预期。尝试调用 setValue:forHTTPHeaderField: 方法。
- 尝试在指定自定义 header 值之前指定编码,例如[theRequest setValue:@"...; charset=UTF-8"forHTTPHeaderField:@"Content-Type"];
如果这些都没有帮助,您可能必须以某种方式对数据进行编码。我建议使用 URL 编码,因为在服务器端实现起来比 Base64 简单得多。对于 iOS 端,请参阅此链接以获取有关如何对字符串进行 URL 编码的信息:
关于c# - 我可以使用 NSUrlSession 在 HTTP header 中允许原始 unicode 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31862774/