正在使用具有多个参数的WCF REST服务with DataContract

本文关键字:WCF REST 服务 DataContract with 参数 | 更新日期: 2023-09-27 18:27:19

我需要用POST方法用多个参数调用我的WCF REST服务,但我无法创建包含我的参数的DataContract,因为我需要简单的类型:我的Web服务将由目标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文件,该文件的Id传递到数据库中。

我的第一个问题是:真的可以像前面所示的那样将几个参数传递给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; }
}

但正如我所说,我不能再这样做了。。。

我希望我足够清楚,如果没有,请毫不犹豫地问我细节!

非常感谢你的帮助。

正在使用具有多个参数的WCF REST服务with DataContract

您可以做一些事情来避免使用数据契约。其中最简单的是使用JSONDOM库,该库允许您将JSON数据创建(和解析)为树,而无需将其转换为现有类。其中两个是JSON.NET项目(在下面的示例代码中使用)或System.JSON库(可以通过NuGet下载)。还有许多用于非.NET语言的JSON库。

为了简化您的生活,您可以做的另一件事是将操作的主体样式从Wrapped(包装响应)更改为Wrapped再更改为WrppedRequest。请求需要包装,因为您有两个输入,但响应没有,所以您可以用它消除一个步骤。

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();
    }
}