我有一个使用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视图如下:
即使JSON有效,服务器也无法完成读取。
我还检查了NSURLConnection JSON Submit to Server 并且据我所知,我发送请求的代码是正确的。
任何想法 - 现在已经把头发拉了3天
答案 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];