Pregunta

En mi contrato de servicio, estoy exponiendo un método que toma Stream como parámetro:

[OperationContract]
[WebInvoke(UriTemplate = "/Upload?fileName={fileName}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Stream Upload(String fileName, Stream fileData);

Cuando hago esto, mi implementación personalizada de WebServiceHost (que se crea en una implementación personalizada de WebServiceHostFactory) está viendo la unión del punto final como CustomBindeing y no WEBHTTPBinding:

public class myWebServiceHost : WebServiceHost {
  .
  .
  .
  protected override void OnOpening() {
    base.OnOpening();
    if (base.Description != null) {
      foreach (ServiceEndpoint endpoint in base.Description.Endpoints) {
        WebHttpBinding binding = endpoint.Binding as WebHttpBinding;
        if (binding != null) { //Will always be null given the operation contract above
          Int32 MB = 1048576 * Convert.ToInt32(ConfigurationManager.AppSettings["requestSizeMax"]);
          binding.MaxReceivedMessageSize = MB;
          binding.TransferMode = TransferMode.Streamed;
        }
      }
    }
  }
}

Este es un problema porque necesito cargar archivos más grandes que 64kb ... cualquier idea sobre cómo iría a la configuración de MaxReceivedMessagessize para una custombinding o cómo asegurar mi vinculación se configura en un WebHTTPBinding.

P.s.Necesito hacer esto programáticamente, así que la configuración .config no será de ningún uso para mí.

¿Fue útil?

Solución

Está bien, así que después de cavar largos y duros en este, esto es lo que acumulé:

protected override void OnOpening() {
  base.OnOpening();
  if (base.Description != null) {
    foreach (ServiceEndpoint endpoint in base.Description.Endpoints) {
      Int32 MB = 1048576 * Convert.ToInt32(ConfigurationManager.AppSettings["requestSizeMax"]);
      switch(endpoint.Binding.GetType().ToString()) {
        case "System.ServiceModel.Channels.CustomBinding":
          CustomBinding custom = (CustomBinding)endpoint.Binding;
          custom.Elements.Find<HttpTransportBindingElement>().MaxReceivedMessageSize = MB;
          custom.Elements.Find<HttpTransportBindingElement>().TransferMode = TransferMode.Streamed;
        break;
        case "System.ServiceModel.WebHttpBinding":
          WebHttpBinding webhttp = (WebHttpBinding)endpoint.Binding;
          webhttp.MaxReceivedMessageSize = MB;
          webhttp.TransferMode = TransferMode.Streamed;
        break;
      }
    }
  }
}

funciona, aunque definitivamente puede mejorarse.Todavía tengo que ver si hay una forma más genérica de manejar esto, en lugar de separar los casos por tipo.Aunque en este momento no veo ninguna otra forma de hacerlo (ya que el tipo de unión se basa en métodos en sí mismo, recuerde que solo cambió de WebHTTPBinding a CustomBinding cuando agregué un parámetro de transmisión a uno de los métodos de servicio).

  • Si alguien tiene alguna otra idea de este tema, por favor publique.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top