Использование службы WCF REST с несколькими параметрами без DataContract - PullRequest
3 голосов
/ 09 марта 2012

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

Я нашел этот синтаксис на сайте 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 с идентификатором, переданным в базу данных.

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

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

Я уже тестировал с 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 Ответ

4 голосов
/ 09 марта 2012

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

Еще одна вещь, которую вы можете сделать, чтобы упростить свою жизнь, - это изменить стиль тела операции с Wrapped (который переносит ответ) на Wrapped на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();
    }
}
...