在 xcode 5 和 ios 7 中使用 WCF 服务
Posted
技术标签:
【中文标题】在 xcode 5 和 ios 7 中使用 WCF 服务【英文标题】:Consume WCF service in xcode 5 and ios 7 【发布时间】:2014-02-17 19:55:47 【问题描述】:我创建了一个 WCF 服务来在 sql server 中插入数据,所以我遵循以下结构。
我首先创建了方法和他的实现;
在 WCF 界面中:
[OperationContract]
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "json/InsertEmployee/id1/id2/id3")]
bool InsertEmployeeMethod(string id1,string id2, string id3);
实施中:
public bool InsertEmployeeMethod(string id1, string id2, string id3)
int success = 0;
using (SqlConnection conn = new SqlConnection("Data Source=NXT1;User ID=zakaria;Password=11;Initial Catalog=EmpDB;Integrated Security=false"))
conn.Open();
decimal value = Decimal.Parse(id3);
string cmdStr = string.Format("INSERT INTO EmpInfo VALUES('0','1',2)", id1, id2, value);
SqlCommand cmd = new SqlCommand(cmdStr, conn);
success = cmd.ExecuteNonQuery();
conn.Close();
return (success != 0 ? true : false);
要测试 Web 服务,请尝试该 URL:
"41.142.251.142/JsonWcfService/GetEmployees.svc/json/InsertEmployee/myName/MylastName/6565"
直到这里一切正常,
所以为了测试这个网络服务,我在 Main.storyboard 中创建了 3 个文本字段(firstName.text 和 lastName.text 和 Salary.text 以及一个用于发送输入数据的按钮)。请注意,我使用过 xcode 5 和 ios 7。
我在 viewcontroller.m 中声明了以下网址: myViewController.m:
#define BaseWcfUrl [NSURL URLWithString:@"41.142.251.142/JsonWcfService/GetEmployees.svc/json/InsertEmployee/id1/id2/id3"]
然后我实现了与点击按钮相关的插入员工方法。
-(void) insertEmployeeMethod
if(firstname.text.length && lastname.text.length && salary.text.length)
NSString *getValue= [BaseWcfUrl stringByAppendingFormat:@"InsertEmployee/%@/%@/%@",firstname.text,lastname.text,salary.text];
NSURL *WcfServiceURL = [NSURL URLWithString:getValue];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:WcfServiceURL];
[request setHTTPMethod:@"POST"];
// connect to the web
NSData *respData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// NSString *respStr = [[NSString alloc] initWithData:respData encoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:respData
options:NSJSONReadingMutableContainers
error:&error];
NSNumber *isSuccessNumber = (NSNumber*)[json objectForKey:@"InsertEmployeeMethodResult"];
所以我遇到的问题是系统总是将str值返回为“Nil”
NSString *getValue= [BaseWcfUrl stringByAppendingFormat:@"InsertEmployee/%@/%@/%@",firstname.text,lastname.text,salary.text];
所以你可以在这里看到所有的消息错误:
2014-02-17 19:49:49.419 InsertData[2384:70b] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“数据参数为零” * 首先抛出调用栈:
0 CoreFoundation 0x017395e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x014bc8b6 objc_exception_throw + 44
2 CoreFoundation 0x017393bb +[NSException raise:format:] + 139
3 基础 0x012037a2 +[NSJSONSerialization JSONObjectWithData:options:error:] + 67
4 InsertData 0x0000236c -[ViewController sendData:] + 1452
5 libobjc.A.dylib 0x014ce874 -[NSObject performSelector:withObject:withObject:] + 77
6 UIKit 0x0022c0c2 -[UIApplication sendAction:to:from:forEvent:] + 108
7 UIKit 0x0022c04e -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
8 UIKit 0x003240c1 -[UIControl sendAction:to:forEvent:] + 66
9 UIKit 0x00324484 -[UIControl _sendActionsForEvents:withEvent:] + 577
10 UIKit 0x00323733 -[UIControl touchesEnded:withEvent:] + 641
11 UIKit 0x0026951d -[UIWindow _sendTouchesForEvent:] + 852
12 UIKit 0x0026a184 -[UIWindow sendEvent:] + 1232
13 UIKit 0x0023de86 -[UIApplication sendEvent:] + 242
14 UIKit 0x0022818f _UIApplicationHandleEventQueue + 11421
CoreFoundation 0x016c283f CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 15
16 核心基础 0x016c21cb __CFRunLoopDoSources0 + 235
17 核心基础 0x016df29e __CFRunLoopRun + 910
18 CoreFoundation 0x016deac3 CFRunLoopRunSpecific + 467
19 核心基础 0x016de8db CFRunLoopRunInMode + 123
20 图形服务 0x036de9e2 GSEventRunModal + 192
21 图形服务 0x036de809 GSEventRun + 104
22 UIKit 0x0022ad3b UIApplicationMain + 1225
23 插入数据 0x00002d5d 主 + 141
24 libdyld.dylib 0x01d7770d 开始 + 1
) libc++abi.dylib:以 NSException 类型的未捕获异常终止
你能帮帮我吗,我压力很大。
非常感谢。
【问题讨论】:
【参考方案1】:我认为您只是输入了错误的 URL,您添加了两次 InsertEmployee
。
将 BaseWcfUrl
更改为 [NSURL URLWithString:@"41.142.251.142/JsonWcfService/GetEmployees.svc/json/"]
而不是 [NSURL URLWithString:@"41.142.251.142/JsonWcfService/GetEmployees.svc/json/InsertEmployee/id1/id2/id3"]
为了绝对确定,将最终 URL 记录到控制台(或在调试器中查看)以确保它是正确的。
另外,在您的代码中,NSURL *WcfServiceURL = [NSURL URLWithString:str];
中,str
来自哪里?你的意思是getValue
吗?
【讨论】:
您好,感谢您的回复,我已将 str 编辑为 getValue。我会按照你的建议去做,然后回复你 我将 BaseWcfUrl 更改为 URL "[NSURL URLWithString:@"41.142.251.142/JsonWcfService/GetEmployees.svc/json/"]" 我将BaseWcfUrl改为URL“[NSURL URLWithString:@"41.142.251.142/JsonWcfService/GetEmployees.svc/json/"]”但是现在系统又出现了一个错误; [NSURL stringByAppendingFormat:]:无法识别的选择器发送到实例 0x8a630b0。由于未捕获的异常'NSInvalidArgumentException','原因:'-[NSURL stringByAppendingFormat :]:无法识别的选择器发送到实例0x8a630b0而终止应用程序以上是关于在 xcode 5 和 ios 7 中使用 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章
PresentViewController 自定义大小并在 Xcode 5 和 iOS 7 中居中
如何在新的 iOS 7 和 Xcode 5 上使用旧 ios 版本构建我的应用程序