У меня есть служба WCF REST, размещенная в службе Windows, и я хотел бы отправить HTTP-заголовок Access-Control-Allow-Origin (определенный как часть CORS ) с каждый ответ.
Моя попытка решения заключалась в том, чтобы иметь что-то вроде следующего в реализации IDispatchMessageInspector :
public void BeforeSendReply(ref Message reply, object correlationState)
{
var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
if (httpResponse != null)
{
// test of CORS
httpResponse.Headers["Access-Control-Allow-Origin"] = "*";
}
}
Обычно это работает, но, к сожалению, моя служба также использует базовую авторизацию HTTP , что означает что при поступлении запроса без заголовка авторизации WCF автоматически отправляет ответ 401 с запросом учетных данных. К сожалению, WCF не вызывает мой IDispatchMessageInspector во время этого начального обмена, поэтому заголовок Access-Control-Allow-Origin не добавляется к начальному обмену.
Проблема возникает, когда я пытаюсь вызвать службу из браузера. CORS указывает, что запросы между источниками должны быть разрешены, только если исходный домен совпадает с доменом, указанным в заголовке ответа Access-Control-Allow-Origin (* соответствует всем доменам). К сожалению, когда браузер видит начальный ответ 401 без заголовка Access-Control-Allow-Origin, он предотвращает доступ (согласно той же политике происхождения ).
Есть ли способ добавить заголовок к первоначальному ответу 401, автоматически отправляемому WCF?
Добавление следующей строки к первому методу, который называют в Сервисе WCF, работало на меня.
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
Требует, чтобы следующий импорт
System.ServiceModel.Web;