如何将数据从iOS发送到c#web服务

时间:2012-12-17 19:11:27

标签: c# ios web-services ipad rest

我开发了一个c#rest web服务来与我的iPad应用程序通信,到目前为止我一直在使用它没有问题。这是一个非常简单的事情,有几个查询和GET方法到目前为止对我来说非常好。现在的问题是我正在尝试将数据从我的应用程序发送到Web服务,以插入到我的数据库中。

NSString *query = [NSString stringWithFormat:@"http:mywebsite.com"];
    _theURL = [[NSURL alloc]initWithString:query];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:_theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:15.0];
    [request setHTTPMethod:@"POST"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
    NSData *requestData = [NSData dataWithBytes:[json UTF8String] length:[json length]];
    [request setHTTPBody:requestData];
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];

这基本上是我的目标-C代码,我尝试建立连接,设置http方法发布和编码我要发送的NSData。这个NSData只是一个json字符串,已经很好了。

现在在我的Web服务中,我尝试使用Byte []获取此NSData以解码为字符串,获取我的json以及on和on。事情是我无法做到这一点。我的Web服务方法代码是:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public bool submitResults(Byte[] data) {
String jsonString = System.Text.Encoding.UTF8.GetString(data);
try{
  JavaScriptSerializer json = new JavaScriptSerializer();
var resultado = json.Deserialize<Pergunta[]>(jsonString);

......它继续。恢复所有这些:我无法将数据发送到Web服务,因此我可以将其插入到我的数据库中。任何帮助都会非常感激。

不过,我得到的错误是这个可怕的事情:

  

{“Message”:“Type \ u0027System.Collections.Generic.IDictionary`2 [[System.String,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Object,mscorlib,版本= 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] \ u0027不支持反序列化数组。“,”StackTrace“:”at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list,Type System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)\ r \ n at,type,JavaScriptSerializer serializer,Boolean throwOnError,IList&amp; convertedList)\ r \ n System.Web.Script.Serialization.VathScript序列化程序,String输,在System.Web.Script.Script.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context,WebServiceMethodData)的System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](字符串输入)\ r \ n的类型类型,Int32 depthLimit)\ r \ n methodData)”, “ExceptionType”: “System.InvalidOperationException”}

所以,试着帮助你帮助我,这是我的json:=)

[
  {
    "categoriaID" : 1,
    "cursoID" : "601",
    "perguntaID" : "1",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 1,
    "cursoID" : "601",
    "perguntaID" : "2",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 1,
    "cursoID" : "601",
    "perguntaID" : "3",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 1,
    "cursoID" : "601",
    "perguntaID" : "21",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 2,
    "cursoID" : "601",
    "perguntaID" : "4",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 2,
    "cursoID" : "601",
    "perguntaID" : "5",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 3,
    "cursoID" : "601",
    "perguntaID" : "6",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 3,
    "cursoID" : "601",
    "perguntaID" : "7",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 3,
    "cursoID" : "601",
    "perguntaID" : "8",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "9",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "10",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "11",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "12",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 4,
    "cursoID" : "601",
    "perguntaID" : "13",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 5,
    "cursoID" : "601",
    "perguntaID" : "14",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 5,
    "cursoID" : "601",
    "perguntaID" : "15",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 5,
    "cursoID" : "601",
    "perguntaID" : "16",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 6,
    "cursoID" : "601",
    "perguntaID" : "17",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 6,
    "cursoID" : "601",
    "perguntaID" : "18",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 6,
    "cursoID" : "601",
    "perguntaID" : "19",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 6,
    "cursoID" : "601",
    "perguntaID" : "20",
    "nb" : 19574,
    "respostaTipo" : "Bom"
  },
  {
    "categoriaID" : 7,
    "cursoID" : "601",
    "perguntaID" : 22,
    "respostaTexto" : "Adorei!",
    "nb" : 19574
  }
]

更新:

经过大量研究,我认为它与我在Xcode中的序列化有关。它是这样的:

_arrayPerguntas = [[NSMutableArray alloc]init];
    for (int i = 0; i < _conteudoProgramatico.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:1]];
        [resp setPerguntaID:[_idConteudoProgramatico objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasConteudoProgramatico objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _sessoesPraticas.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:2]];
        [resp setPerguntaID:[_idSessoesPraticas objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasSessoesPraticas objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _materiaisSuporte.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:3]];
        [resp setPerguntaID:[_idMateriaisSuporte objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasMateriaisSuporte objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _apresentacao.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:4]];
        [resp setPerguntaID:[_idApresentacao objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasApresentacao objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _expectativas.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:5]];
        [resp setPerguntaID:[_idExpectativas objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasExpectativas objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    for (int i = 0; i < _feedBack.count; i++) {
        InqueritosResposta *resp = [[InqueritosResposta alloc]init];
        [resp setNb:[NSNumber numberWithInt:_nb]];
        [resp setCursoID:[self indiceSessao:_nomeSessao]];
        [resp setCategoriaID:[NSNumber numberWithInt:6]];
        [resp setPerguntaID:[_idFeedback objectAtIndex:i]];
        [resp setRespostaTipo:[self codeToString:[_respostasFeedback objectAtIndex:i]]];
        [_arrayPerguntas addObject:resp];
    }
    InqueritosResposta *resp = [[InqueritosResposta alloc]init];
    [resp setNb:[NSNumber numberWithInt:_nb]];
    [resp setCursoID:[self indiceSessao:_nomeSessao]];
    [resp setCategoriaID:[NSNumber numberWithInt:7]];
    [resp setPerguntaID:[NSNumber numberWithInt:22]];
    [resp setRespostaTexto:_respostaObservacoes];
    [_arrayPerguntas addObject:resp];

    NSError *writeError = nil;
    NSMutableArray *jsonRespostas = [[NSMutableArray alloc]init];
    for(InqueritosResposta *resp in _arrayPerguntas)
    {
        NSMutableDictionary *jAnswer = [[NSMutableDictionary alloc] init];
        [jAnswer setObject:resp.nb forKey:@"nb"];
        [jAnswer setObject:resp.cursoID forKey:@"cursoID"];
        [jAnswer setObject:resp.categoriaID forKey:@"categoriaID"];
        [jAnswer setObject:resp.perguntaID forKey:@"perguntaID"];
        if (resp.respostaTipo != nil) {
            [jAnswer setObject:resp.respostaTipo forKey:@"respostaTipo"];
        }
        if (resp.respostaTexto != nil) {
            [jAnswer setObject:resp.respostaTexto forKey:@"respostaTexto"];
        }
        [jsonRespostas addObject: jAnswer];
    }
    NSArray *final = [NSArray arrayWithArray:jsonRespostas];
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:final options:NSJSONWritingPrettyPrinted error:&writeError];

    [self submitData:jsonData];

基本上我把所有对象放在_arrayPerguntas中来自不同的来源。然后我使用字典将它们全部正确地放在另一个数组(最终数组)中。 submitData方法是我在上面输入的连接设置方法。 提前谢谢,

快乐编码,

ruitex23

2 个答案:

答案 0 :(得分:0)

不要这样做。如果您使用Microsoft技术连接它们,请不要使用Microsoft的复杂方法来实现仅提供优势的Web服务。即使这样,它也是......最不稳定的。

了解JSONResult MVC控制器方法。这些为您提供了对应用程序行为的最独立于平台的控制,您不会遇到任何模糊的错误,例如您遇到的错误。这两种方式都是纯粹的JSON,并且没有猜测。

答案 1 :(得分:0)

我认为它在反序列化方面失败了。请验证您的json对象(jsonString)。一个非常好的在线json验证器是jsonlint.com