繁体   English   中英

在Rest Wcf Service中传递参数

[英]Passing parameters in Rest Wcf Service

在我的REST WCF服务中,我传递了将近15个参数。 我在URL中传递这些参数,如下所示:

www.mysite.com/wcfservice/mymethod/{p1},{p2},{p3},{p4}...

有没有更好的方法来传递参数? 在URL中使用传递的参数是否会引起任何安全问题(例如SQL注入)? 改为使用XML文件传递参数是否明智? 在REST WCF服务中传递校验器的最佳方法是什么?

假设您的方法是幂等的 (即GET),似乎您知道无法使用主体进行传输。 因此,您只剩下URL和标题。

将标头中与该特定请求无关的信息(例如您的ProtocolVersion,SystemName)放入标头中,然后在服务中解析这些标头。

在URL中,输入上下文相关的参数和执行操作所需的参数:例如EntityId,FilterValue。

如果要传递一个参数的列表(例如value1 = 1,2,3),则可以考虑使用自定义QueryString Converter(请参见下文-将行为附加到端点是另一项工作)。

最后,您可能只需要传递那么多参数。 对于基于搜索的操作来说,这很常见,在其中可能要搜索各种维度。

using System;
using System.Linq;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;

public class CustomQueryStringConverter : QueryStringConverter
{

    public override bool CanConvert(Type type)
    {
        return base.CanConvert(type.IsArray ? type.GetElementType() : type);
    }

    public override object ConvertStringToValue(string parameter, Type parameterType)
    {
        object result = null;

        if (parameterType.IsArray)
        {

            if (!ReferenceEquals(parameter, null))
            {
                object[] items = parameter
                    .Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                    .Where(s => !string.IsNullOrWhiteSpace(s))
                    .Select(s => base.ConvertStringToValue(s.Trim(), parameterType.GetElementType()))
                    .ToArray();

                Array arrayResult = Array.CreateInstance(parameterType.GetElementType(), items.Length);

                for (int i = 0; i < items.Length; ++i)
                {
                    arrayResult.SetValue(items[i], i);
                }

                result = arrayResult;
            }

        }
        else
        {
            result = base.ConvertStringToValue(parameter, parameterType);
        }

        return result;
    }

    public override string ConvertValueToString(object parameter, Type parameterType)
    {

        string result = string.Empty;

        if (parameterType.IsArray)
        {

            foreach (object item in (Array)parameter)
            {
                result += item.ToString() + ",";
            }

            result = result.TrimEnd(',');
        }
        else
        {
            result = base.ConvertValueToString(parameter, parameterType);
        }

        return result;
    }


    public class CustomQueryStringBehavior : WebHttpBehavior
    {

        protected override QueryStringConverter GetQueryStringConverter(OperationDescription operationDescription)
        {
            return new CustomQueryStringConverter();
        }

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM