2

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

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

我有一个 iOS 应用程序,它使用 NSURLConnect 向服务发送非常相同的 JSON 请求,但它总是超时。我使用 WireShark 进行了跟踪,在这两种情况下,HTTP 请求都正确形成并正确发送到服务器。我使用 MS Trace Viewer 进行了跟踪,它进入“接收字节”但永远不会返回。当我最终关闭 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 跟踪

即使 JSON 有效,服务器也没有完成读取是否有任何原因。

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

任何想法 - 拉我的头发已经 3 天了

4

2 回答 2

0

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

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

于 2013-03-19T09:37:22.757 回答
0

如果你改变这个会发生什么:

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

对此:

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

可能不会有什么不同,但你的代码的其余部分看起来不错,所以也许值得一试。(我的想法是小数导致服务器问题)。

于 2013-03-13T17:11:19.893 回答