У меня была служба WCF с использованием CORS, размещенная в консольном приложении, которое отлично работало в .Net 4.5. теперь приложение должно работать в .Net 3.5, а предварительный запрос OPTIONS теперь не выполняется для любого POST-запроса.
Вот интерфейс для сервисов:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
BiometricCaptureResponse Start(BiometricCaptureRequest biometricRequest);
[OperationContract]
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
void Options();
Собственно сервис:
public BiometricCaptureResponse Start(BiometricCaptureRequest biometricRequest)
{
//Stuff and things
}
public void Options()
{
return;
}
Поведение для CORS, которое применяется к запросам и ответам
public string clientOrigin;
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
HttpRequestMessageProperty requestProperty = request.Properties[HttpRequestMessageProperty.Name]
as HttpRequestMessageProperty;
if (requestProperty != null && requestProperty.Headers.AllKeys.Contains("Origin") && !string.IsNullOrEmpty(requestProperty.Headers["Origin"]))
{
clientOrigin = requestProperty.Headers["Origin"];
}
return null;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
HttpResponseMessageProperty httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
if (httpHeader != null)
{
httpHeader.ApplyCrossOriginSupport(clientOrigin);
}
}
public static void ApplyCrossOriginSupport(this HttpResponseMessageProperty message, string origin)
{
message.Headers.Add("Access-Control-Allow-Origin", origin);
message.Headers.Add("Access-Control-Allow-Method", ConfigurationManager.AppSettings["Access-Control-Allow-Method"]);
message.Headers.Add("Access-Control-Allow-Headers", ConfigurationManager.AppSettings["Access-Control-Allow-Headers"]);
}
все это работало плавно в 4.5, это процесс, который должен был произойти:
- ПослеПолученияЗапроса()
- Обращение к сервису Options()
- ПередОтправитьОтвет()
- ПослеПолученияЗапроса()
- Начинать()
- ПередОтправитьОтвет()
Теперь в 3.5 служба Ooptions не будет поражена, что приведет к сбою всего запроса. Есть ли что-то, чего мне не хватает, чтобы заставить это работать для 3.5?
Ошибка, которую я получаю из консоли Chrome:
OPTIONS http://localhost:8502/testservice.svc/rest/Start net::ERR_CONNECTION_RESET
может ли это иметь какое-либо отношение к атрибуту WebInvoke? На странице MSDN она описывается как клиентская технология 4.5/3.5, а я использую только .Net 3.5.
ОБНОВЛЕНИЕ: изменение следующего атрибута службы параметров для использования всех методов
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
[WebInvoke(Method = "*", UriTemplate = "*")]
разрешил запросы опций попадать в службу, приложение может работать так функционально, но это все еще не оптимальное решение, поскольку оно не относится к запросу OPTIONS, по какой причине?