在 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 服务的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 5 中支持 iOS 5 和 iOS 6

PresentViewController 自定义大小并在 Xcode 5 和 iOS 7 中居中

如何在新的 iOS 7 和 Xcode 5 上使用旧 ios 版本构建我的应用程序

Xcode 5,如何使用与 IOS 6 和 IOS 7 兼容的 UI 构建应用程序 [重复]

横向应用 Xcode 5 / iOS 7

iOS 7 / Xcode 5:以编程方式访问设备启动图像