在 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 应用程序开发中将数据从版本保存到版本?

在应用程序中将 Youtube 视频保存到 iPhone

如何直接在 iPhone 中将 OTP 从用户的消息框填充到应用程序? [复制]

如何在 Azure 应用服务中将 X509Certificate2 与 WCF 一起使用