Question

Dans mon contrat de service, j'expose une méthode qui prend flux comme paramètre:

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

Lorsque je fais cela, ma mise en œuvre de WebserviceHost personnalisée (qui est instanciée à partir d'une implémentation de WebServiceHostFactory personnalisée) consiste à voir la liaison du point de terminaison comme étant en tant que personnalisée et non WebhttpLinding:

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;
        }
      }
    }
  }
}

Ceci est un problème car j'ai besoin de télécharger des fichiers de plus de 64 kb ... toutes les idées sur la manière dont je voudrais créer maxreceEvedMessagesifie pour un mode de vue ou comment assurer ma liaison est définie sur un WebhttpLinding.

P.s.J'ai besoin de le faire par programme, donc .Config Les paramètres ne seront utiles pour moi.

Était-ce utile?

La solution

D'accord alors après avoir creusé longtemps et difficile sur celui-ci, c'est ce que j'ai proposé:

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;
      }
    }
  }
}

Cela fonctionne, bien qu'il puisse certainement être amélioré.J'ai encore besoin de voir s'il existe une manière plus générique de manipuler cela, plutôt que de séparer les cas par type.Même si je ne vois pas d'autre façon de le faire (car le type de liaison est basé sur des méthodes dans le service lui-même, rappelez-vous qu'il ne s'agissait que de WebhttpLinding à la tête de la tête lorsque j'ai ajouté un paramètre de flux à l'une des méthodes de service.).

  • Si quelqu'un a une autre perspicacité sur ce sujet, veuillez poster.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top