2012-03-09 5 views
3

Мне нужно позвонить в службу WCF REST с несколькими параметрами с помощью метода POST, но я не могу создать DataContract, содержащий мои параметры, потому что мне нужны простые типы: мой веб-сервис будет использоваться объективное приложение C.Использование службы WCF REST с несколькими параметрами БЕЗ DataContract

Я нашел этот синтаксис на сайте MSDN:

[OperationContract] 
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "savejson?id={id}&fichier={fichier}")] 
bool SaveJSONData(string id, string fichier); 

Чтобы объяснить быстро контекст, я должен вызвать этот метод, чтобы спасти JSON-файл с Id передается в базу данных.

Мой вопрос: действительно ли возможно передать несколько параметров методу POST, как показано выше?

Во-вторых: как я могу сделать, чтобы использовать мой сервис (на данный момент, чтобы проверить его) с несколькими параметрами?

Я уже протестирована с DataContract, и я делал так:

string url = "http://localhost:62240/iECVService.svc/savejson"; 
     WebClient webClient = new WebClient(); 
     webClient.Headers["Content-type"] = "application/json; charset=utf-8"; 
     RequestData reqData = new RequestData { IdFichier = "15", Fichier = System.IO.File.ReadAllText(@"C:\Dev\iECV\iECVMvcApplication\Content\fichier.json") }; 
     MemoryStream requestMs = new MemoryStream(); 
     DataContractJsonSerializer requestSerializer = new DataContractJsonSerializer(typeof(RequestData)); 
     requestSerializer.WriteObject(requestMs, reqData); 
     byte[] responseData = webClient.UploadData(url, "POST", requestMs.ToArray()); 
     MemoryStream responseMs = new MemoryStream(responseData); 
     DataContractJsonSerializer responseSerializer = new DataContractJsonSerializer(typeof(ResponseData)); 
     ResponseData resData = responseSerializer.ReadObject(responseMs) as ResponseData; 

RequestData и ResponseData были объявлены так:

[DataContract(Namespace = "")] 
public class RequestData 
{ 
    [DataMember] 
    public string IdFichier { get; set; } 

    [DataMember] 
    public string Fichier { get; set; } 
} 

[DataContract] 
public class ResponseData 
{ 
    [DataMember] 
    public bool Succes { get; set; } 
} 

Но, как я уже сказал, я не могу сделайте это вот так ...

Надеюсь, я достаточно ясен, если нет, не стесняйтесь спрашивать подробности!

Большое спасибо за помощь.

+1

Использование контракта с данными не требует ничего особенного клиента. Что особенного в вашем клиенте ObjC, что отличает вашу ситуацию? –

ответ

4

Есть несколько вещей, которые вы можете сделать, чтобы избежать использования контрактов с данными. Самый простой из них - использовать библиотеку JSON DOM, которая позволяет создавать (и анализировать) данные JSON как дерево без необходимости их преобразования в существующие классы. Два из них - проект JSON.NET (используется в примере кода ниже) или библиотека System.Json (можно загрузить через NuGet). Существует много JSON-библиотек для языков не.NET.

Еще одна вещь, которую вы можете сделать, чтобы упростить жизнь, - это изменить стиль тела операции с обернутого (который обертывает ответ) на Wrapped to WrappedRequest. Запрос нужно обернуть, так как у вас есть два входа, но ответа нет, поэтому вы можете устранить один шаг с этим.

public class Post_182e5e41_4625_4190_8a4d_4d4b13d131cb 
{ 
    [ServiceContract] 
    public class Service 
    { 
     [OperationContract] 
     [WebInvoke(Method = "POST", 
      ResponseFormat = WebMessageFormat.Json, 
      RequestFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.WrappedRequest, 
      UriTemplate = "savejson")] 
     public bool SaveJSONData(string id, string fichier) 
     { 
      return true; 
     } 
    } 

    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     JObject json = new JObject(); 
     json.Add("id", JToken.FromObject("15")); 
     json.Add("Fichier", "the file contents"); //System.IO.File.ReadAllText(@"C:\Dev\iECV\iECVMvcApplication\Content\fichier.json")); 

     WebClient c = new WebClient(); 
     c.Headers[HttpRequestHeader.ContentType] = "application/json"; 
     string result = c.UploadString(baseAddress + "/savejson", json.ToString(Newtonsoft.Json.Formatting.None, null)); 
     JToken response = JToken.Parse(result); 
     bool success = response.ToObject<bool>(); 
     Console.WriteLine(success); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+1

Большое спасибо за ваш ответ! Ваше второе предложение спасло мне жизнь! Это было именно то, что мне нужно. – Spikuria

+0

Как бы это сделать, если я хочу использовать XML вместо этого? Как выглядит метод Test()? – Pavel

Смежные вопросы