Вопрос по wcf, rest – WCF 4.0 Cookie Only First записывается браузером

4

Я работаю над самым быстрым способом записи файлов cookie из службы REST консольного приложения WCF с WebHttpBinding. Я готовлю «Установить файлы cookie», но в браузере устанавливается только первый файл cookie (с использованием FireFox 11.0 в Windows), а также значение «Срок действия».

<code>var expiry = DateTime.Now.AddMonths( 6 );
var outresp = WebOperationContext.Current.OutgoingResponse;
outresp.Headers.Add( HttpResponseHeader.SetCookie , "cookie1=fd9416ea-2705-4d44-be76-f2f7b95e6b13; cookie2=7d489e69-d9c9-4b8d-a4b1-bce0da1c5966;expires=" + expiry );
</code>

Я также попытался поставить запятую между первым файлом cookie и вторым, но это тоже не сработало:

<code>outresp.Headers.Add( HttpResponseHeader.SetCookie , "cookie1=fd9416ea-2705-4d44-be76-f2f7b95e6b13;, cookie2=7d489e69-d9c9-4b8d-a4b1-bce0da1c5966;expires=" + expiry );
</code>

Я вырубил это и разжег Фиддлера:

<code>outresp.Headers.Add( HttpResponseHeader.SetCookie , "foo=foovalue;,bar=barvalue;" );
</code>

и Фидлер показывает это:

<code>Response sent 27 bytes of Cookie data:
    Set-Cookie: foo=foovalue;,bar=barvalue;

This response did not contain a P3P Header.

Validate P3P Policies at: http://www.w3.org/P3P/validator.html
Learn more at: http://www.fiddler2.com/redir/?id=p3pinfo
</code>

Что говорит мне, что я не форматирую что-то на стороне .NET, чтобы сделать куки приемлемыми для браузера.

Как я могу получить все файлы cookie в браузере с первым значением? Что я пропустил

Благодарность

[ РЕДАКТИРОВАТЬ

Я обратился в Microsoft за поддержкой и узнал следующее:

Тот факт, что «Set-Cookie» объединяется в одну строку cookie, регистрируется как ошибка в Microsoft для .NET Framework 4.0, а также Framework 4.5. В группе разработчиков Microsoft WCF ошибка указана как «закрытая» и «не будет исправлена».
По словам Microsoft, единственный обходной путь - это перейти от самостоятельного размещения к хостингу в IIS, а затем напрямую использовать объект ответа (IIS) (другой путь кода, в котором нет ошибки).

Также включите конфигурацию вашего хоста и код. Petar Vučetin
Предоставление конфигурации сервиса, интерфейса сервиса, атрибутов класса сервиса и атрибутов метода может быть полезным. Petar Vučetin

Ваш Ответ

2   ответа
1

что это более старая статья, поскольку она все еще остается проблемой, а использование AspNetCompatibilityMode с WCF значительно снижает производительность, предоставляемый MSFT вариант недопустим при многих / большинстве / любых обстоятельствах. Я собираюсь ответить на этот вопрос поздно, так как этот вопрос все еще существует.

Единственный способ решить эту проблему - вывести заголовок ответа Set-Cookie, как вы показали, но обработать этот заголовок ответа на стороне клиента с помощью javascript и поместить его в браузер, поскольку, как вы заметили, браузер не будет обрабатывать этот ответ. Также не будет применено более одного заголовка ответа Set-Cookie, как отмечалось в этой ошибке, которую я создал.

http: //connect.microsoft.com/VisualStudio/feedback/details/779111/wcf-rest-service-two-set-cookie-http-headers-invalid-set-cookie-header-synta

Так, обработайте заголовок ответа и используйте document.cookie в клиентском javascript для размещения файлов cookie в браузере в обработчике успеха вашего запроса jQuery .ajax.

0

AspNetCompatibilityMode работает и требует следующего:

AspNetCompatibilityRequirements установлен для класса обслуживания либоAllowed илиRequired например :

[AspNetCompatibilityRequirements(RequirementsMode
       = AspNetCompatibilityRequirementsMode.Allowed)]
public class AppService : IAppService

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> установлен в<system.serviceModel>

Это дает доступ кHttpContext (вам понадобитьсяusing System.Web;, чтобы получить доступ к этому) и куки могут быть установлены с помощью:

var aCookie = new HttpCookie("foo")
{
    HttpOnly = true,
    Value = "bar",
    Expires = DateTime.Now.AddDays(1)
};

HttpContext.Current.Response.Cookies.Add(aCookie);

Это затем нужно будет запускать как приложение на IIS, а не на панели запуска WCF, и если установлено несколько файлов cookie, на самом деле появятся несколько заголовков файлов cookie.

Похожие вопросы