Я бы сказал, что это то, что вы ищете:
RewriteEngine on
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteRule ^/?news/(en|de|fr|es)/?$ /news?lang=$1 [END]
Если это правило приводит к «внутренней ошибке сервера» (http status 500), то есть вероятность, что вы используете очень старая версия http-сервера apache. В этом случае либо обновите свой сервер, либо попробуйте использовать более старый флаг [L]
вместо флага [END]
. Он может работать так же, но это зависит от остальной части установки. Вы найдете явный намек на флаг [END]
, который в этом случае не поддерживается, в файле журнала ошибок http-серверов.
Это правило также будет работать в конфигурации хоста http-серверов или в файле динамической конфигурации (файл стиля ".htaccess"). Если вам действительно нужно использовать такой динамический файл, то позаботьтесь о том, чтобы в вашей конфигурации хоста была включена его интерпретация, а указанное выше правило помещалось в такой файл в папке DOCUMENT_ROOT
хоста http.
И общее замечание: вы всегда должны предпочитать размещать такие правила в конфигурации хоста http-серверов вместо использования файлов динамической конфигурации (".htaccess"). Эти динамические конфигурационные файлы добавляют сложность, часто являются причиной неожиданного поведения, их трудно отладить, и они действительно замедляют работу http-сервера. Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).
Результаты:
Я наконец нашел хорошее сообщение в блоге, которое помогло мне разрешить это. Оказывается, что я в значительной степени делал вещи правильно, но я помещал тест в Скрипача неправильно. Я также добавил еще несколько деталей к своему атрибуту.
[WebInvoke(RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml,
Method = "POST", UriTemplate = "tasks/{description}",
BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
void AddTask(string description);
Когда я поместил свой Uri в Скрипача, он должен был быть похожим на это:
http://ipv4.fiddler:8054/tasks/this+is+a+sample+desc+that+works
Теперь мой сервис правильно принимает данные и может добавить задачу к базе данных.
Смотрите на Стартовый набор REST WCF, который может быть загружен с CodePlex здесь.
Я думаю, что это в значительной степени описывает, как добавить объект к контейнеру успокоительным способом.
В зависимости от требований Вы могли просто включить регулярный CRUD через Асторию? У меня есть последовательное покрытие, как сделать это с LINQ-SQL здесь. Просто мысль.
Если Вы хотите сделать, УСПОКОИТЕЛЬНЫЙ веб-сервис затем не использует приложение WCF. Измените свой шаблон URI к чему-то как Задача / новый и поместите данные новой задачи в теле запроса HTTP POST. Я реализую УСПОКОИТЕЛЬНЫЕ веб-сервисы в ASP.NET как универсальные обработчики (*.ashx). Это позволяет мне подготавливать http метод и идти оттуда.
kevin