在 iPhone 应用程序中将数据发布到 WCF 服务?
Posted
技术标签:
【中文标题】在 iPhone 应用程序中将数据发布到 WCF 服务?【英文标题】:Post data to WCF service in iPhone application? 【发布时间】:2013-03-05 20:33:49 【问题描述】:我是 ios 开发的新手,我需要使用本地方法将数据发布到服务。
我想我需要做这样的事情吗?
NSString *content = @"field1=42&field2=Hello";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.mywebsite.co.uk/SendEmail.svc/request"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[content dataUsingEncoding:NSISOLatin1StringEncoding]];
// generates an autoreleased NSURLConnection
[NSURLConnection connectionWithRequest:request delegate:self];
我不确定我是否正确?我可以通过手动构建 url 或在 fiddler 中发布 json 来成功发布到服务。
【问题讨论】:
【参考方案1】:你可以这样做:
在您的 WCF 服务中创建这样的 Web 服务方法(类似接口或具体服务实现):
[OperationContract]
[WebInvoke(UriTemplate = "GetJourneys", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
JourneyListResult GetJourneys(string sessionID);
Request / Reponse 对象可以是任何 DataContract 对象(将通过 .NET 的DataContractJsonSerializer
序列化)
创建一个有效载荷字典以在您的请求中使用:
NSDictionary *payloadDict = [NSDictionary dictionaryWithObjectsAndKeys:self.sessionID,@"sessionID", nil];
NSString *operationName = "GetJourneys";
创建这样的请求:
NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
urlRequest.URL = [NSURL URLWithString:[@"http://url/of/your/Service.svc/" stringByAppendingString:operationName];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest addValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-type"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payloadDict options:0 error:NULL];
[urlRequest setHTTPBody:jsonData];
ITLog(@"Issuing request: %@ %@", self.operationName, [self payloadDict]);
发送您的请求(backgroundQueue 是先前创建的 NSOperationQueue。请务必分派到主队列(/线程)以进行 UI 处理):
[NSURLConnection sendAsynchronousRequest:urlRequest queue:backgroundQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
if (!error && data.length > 0)
NSError *jsonError = nil;
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError];
if (!jsonError && [jsonObj isKindOfClass:[NSDictionary class]])
// process result here
else
// error handling
else
// error handling
];
解码/使用结果
if ([jsonObject isKindOfClass:[NSArray class]])
NSArray *dictarr=(NSArray*)jsonObject;
NSMutableArray *resultarr=[[NSMutableArray alloc] init];
for (NSDictionary *dict in dictarr)
ITJourney *journey =[[ITJourney alloc]initWithDictionary:dict];
[resultarr addObject:journey];
// use resultarr from here...
你可以在我为大学创建的一个小示例项目中看到它:
App link 和 WCF service link 它还具有用于上传图像的会话处理和二进制流(非常基本)
【讨论】:
【参考方案2】:感谢 Martin 的那篇文章,它很有帮助。我在连接时遇到了麻烦,经过一番摸索,我发现我的 svc 不接受 json 内容类型。我的解决方法是将 Factory="System.ServiceModel.Activation.WebServiceHostFactory" 属性添加到 .SVC 文件中,因此:
<%@ ServiceHost Language="C#" Debug="true" Service="YourService" CodeBehind="YourService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
希望这对某人有帮助...
【讨论】:
【参考方案3】:我不知道您所说的本地方法是什么意思,但如果您打算做很多这样的事情,特别是如果您打算对请求进行排队,您可能需要研究第三方库,例如 AFNetworking。
也就是说,如果您能够成功发布到服务,那么问题是什么?
【讨论】:
以上是关于在 iPhone 应用程序中将数据发布到 WCF 服务?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2019 中将 WCF 服务添加到 .NET Core 项目?
在 iPhone 上使用 Objective-C 使用 WCF Web 服务
如何在 iphone 应用程序开发中将数据从版本保存到版本?