在 RESTful WCF 服务中将类作为参数传递 [英] Passing a class as parameter in RESTful WCF Service

查看:24
本文介绍了在 RESTful WCF 服务中将类作为参数传递的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的 RESTful WCF 服务中,我需要传递一个类作为 URITemplate 的参数.我能够传递一个字符串或多个字符串作为参数.但是我有很多字段要传递给 WCF 服务.所以我创建了一个类并将所有字段添加为属性,然后我想将这个类作为一个参数传递给 URITemplate.当我尝试将类传递给 URITemplate 时出现错误路径段必须具有字符串类型".它不接受类作为参数.任何想法如何将类作为参数传递.这是我的代码(inputData 是类)

In my RESTful WCF Serice I need to pass a class as a parameter for URITemplate. I was able to pass a string or multiple strings as parameters. But I have a lot of fields are there to pass to WCF Service. So I have created a class and added all the fields as properties and then I want to pass this class as one paramenter to the URITemplate. When I am trying to pass class to the URITemplate I am getting error "Path segment must have type string". Its not accepting class as a parameter. Any idea how to pass class as a parameter. Here is my code (inputData is class)

    [OperationContract]
    [WebGet(UriTemplate = "/InsertData/{param1}")]
    string saveData(inputData param1);

推荐答案

您实际上可以在 GET 请求中传递一个复杂类型(类),但是您需要通过 QueryStringConverter教"WCF 如何使用它.但是,您通常不应该这样做,尤其是在会改变服务中某些内容的方法中(GET 应该用于只读操作).

You actually can pass a complex type (class) in a GET request, but you need to "teach" WCF how to use it, via a QueryStringConverter. However, you usually shouldn't do that, especially in a method which will change something in the service (GET should be for read-only operations).

下面的代码显示了在 GET(使用自定义 QueryStringConverter)和 POST(它应该完成的方式)中传递复杂类型.

The code below shows both passing a complex type in a GET (with a custom QueryStringConverter) and POST (the way it's supposed to be done).

public class StackOverflow_6783264
{
    public class InputData
    {
        public string FirstName;
        public string LastName;
    }
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        [WebGet(UriTemplate = "/InsertData?param1={param1}")]
        string saveDataGet(InputData param1);
        [OperationContract]
        [WebInvoke(UriTemplate = "/InsertData")]
        string saveDataPost(InputData param1);
    }
    public class Service : ITest
    {
        public string saveDataGet(InputData param1)
        {
            return "Via GET: " + param1.FirstName + " " + param1.LastName;
        }
        public string saveDataPost(InputData param1)
        {
            return "Via POST: " + param1.FirstName + " " + param1.LastName;
        }
    }
    public class MyQueryStringConverter : QueryStringConverter
    {
        public override bool CanConvert(Type type)
        {
            return (type == typeof(InputData)) || base.CanConvert(type);
        }
        public override object ConvertStringToValue(string parameter, Type parameterType)
        {
            if (parameterType == typeof(InputData))
            {
                string[] parts = parameter.Split(',');
                return new InputData { FirstName = parts[0], LastName = parts[1] };
            }
            else
            {
                return base.ConvertStringToValue(parameter, parameterType);
            }
        }
    }
    public class MyWebHttpBehavior : WebHttpBehavior
    {
        protected override QueryStringConverter GetQueryStringConverter(OperationDescription operationDescription)
        {
            return new MyQueryStringConverter();
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), new WebHttpBinding(), "").Behaviors.Add(new MyWebHttpBehavior());
        host.Open();
        Console.WriteLine("Host opened");

        WebClient client = new WebClient();
        Console.WriteLine(client.DownloadString(baseAddress + "/InsertData?param1=John,Doe"));

        client = new WebClient();
        client.Headers[HttpRequestHeader.ContentType] = "application/json";
        Console.WriteLine(client.UploadString(baseAddress + "/InsertData", "{"FirstName":"John","LastName":"Doe"}"));

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

这篇关于在 RESTful WCF 服务中将类作为参数传递的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆