Передача параметров в Rest Wcf Service - PullRequest
2 голосов
/ 07 сентября 2011

В моей службе REST WCF я передаю почти 15 параметров.Я передаю эти параметры в URL следующим образом:

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

Есть ли лучший способ передачи параметров?Вызывает ли передача параметров, используемых в URL, какие-либо проблемы с безопасностью (например, SQL-инъекция)?Разумно ли передавать параметры, используя вместо этого файл XML?Как лучше всего передать parementers в службе REST WCF?

1 Ответ

1 голос
/ 04 октября 2011

Если ваш метод Идемпотент (то есть GET), кажется, вы знаете, что не можете использовать тело для переноса.Таким образом, у вас остались URL-адрес и заголовки.

Вставьте в заголовки информацию, не зависящую от этого конкретного запроса - например, ProtocolVersion, SystemName - и проанализируйте эти заголовки в службе.

В URL введите те параметры, которые являются контекстными и требуются для выполнения вашей операции: например, EntityId, FilterValue.

Если вы передаете список для одного параметра - например, value1 = 1,2,3- тогда вы можете рассмотреть возможность использования пользовательского конвертера QueryString (см. ниже - присоединение поведения к конечной точке - это еще одно упражнение).

И, в конце концов, вам, возможно, придется просто передать столько параметров.Это очень часто встречается в операциях, основанных на поиске, где могут быть различные измерения для поиска.

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

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...