NSURLConnection到WCF JSON REST服务器超时

时间:2013-03-10 10:09:48

标签: ios wcf rest

我有一个使用Microsoft-HTTPAPI构建的基于Windows的REST服务器(即它不在IIS下运行)

如果我从基于浏览器的REST工具(Firefox RESTClient)向服务发送JSON请求,则服务器会根据Microsoft服务跟踪查看器中的跟踪和服务的响应接收请求并正确处理它。我从服务中收到有效的JSON。

我有一个iOS应用程序,它使用NSURLConnect向服务发送VERY SAME JSON请求,但它总是超时。我已经使用WireShark进行了跟踪,并且在两种情况下都正确地形成了HTTP请求并将其正确发送到服务器。我已经使用MS跟踪查看器跟踪它进入“接收字节”但从未返回。当我最终关闭WCF服务器时,我得到一个例外。当我关闭iOS应用程序时,它永远不会返回。

我尝试过使用NSURLConnection sendSynchronousRequest并使用回调异步并使用完成块异步。如果我使超时为0,则调用(对sendSynchronousRequest)永远不会返回。在所有其他情况下,我得到一个超时,并且WCF永远不会完成WCF调用的接收字节部分(POST请求)

我已经检查了

这是我的iOS代码:

dispatch_queue_t myQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(myQ, ^{ // First Queue the parsing
    @try {
        //Generate endpoint url
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@",appState.posPostingURL,serviceName]];
        //Setup request
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                               cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                           timeoutInterval:10.0];

        NSString *authStr = [NSString stringWithFormat:@"%@:%@", @"xxxx", @"xxxx"];
        NSString *authData = [NSString base64StringFromString:authStr];
        NSString *authValue = [NSString stringWithFormat:@"Basic %@", authData];
        [request setValue:authValue forHTTPHeaderField:@"Authorization"];

        //Setup request headers
        [request setHTTPMethod:@"POST"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [request setValue:@"no-cache" forHTTPHeaderField:@"Cache-Control"];
        [request setValue:[NSString stringWithFormat:@"%d", [dataBuffer length]] forHTTPHeaderField:@"Content-Length"];

        // Put the request data in the request body
        [request setHTTPBody: dataBuffer];
        NSHTTPURLResponse *urlResponse = nil;
        NSError *error = nil;
        // and send to the server synchronously
        serverData = [[NSURLConnection sendSynchronousRequest:request
                                            returningResponse:&urlResponse
                                                        error:&error] mutableCopy];
        // Now check the status and response
        if (error) {

我的WCF代码如下

namespace MyWebService{
[ServiceContract(Name = "MyServiceIntegrator", Namespace = "")]
public interface IMyIntegrator
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/Configure",
        BodyStyle=WebMessageBodyStyle.Bare,
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json)]
    Result Configure(MyServerConfig config);

在app.config文件中,服务端点配置为

binding="webHttpBinding"

Trace视图如下: WCF Trace

即使JSON有效,服务器也无法完成读取。

我还检查了NSURLConnection JSON Submit to Server 并且据我所知,我发送请求的代码是正确的。

任何想法 - 现在已经把头发拉了3天

2 个答案:

答案 0 :(得分:0)

如果你改变了这一点会发生什么:

  [request setValue:[NSString stringWithFormat:@"%d", [dataBuffer length]] forHTTPHeaderField:@"Content-Length"];

对此:

  [request setValue:[NSString stringWithFormat:@"%i", [dataBuffer length]] forHTTPHeaderField:@"Content-Length"];

可能不会有所作为,但你的其余代码看起来很好,所以可能值得一试。 (我的想法是十进制导致服务器问题)。

答案 1 :(得分:0)

ferdil,我认为您可以尝试将超时时间更改为30.0而不是10。

NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url                                                                的CachePolicy:NSURLRequestReloadIgnoringCacheData                                                            timeoutInterval:30.0];