Domanda

Nel mio contratto di servizio sto espandendo un metodo che richiede Stream come parametro:

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

Quando faccio questa implementazione personalizzata di Webservicehost (che viene istanziata da un'implementazione personalizzata di WebservicehostFactory) è vedere il legame di endpoint come personalizzare e non Webhttpninding:

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

Questo è un problema perché ho bisogno di caricare file più grandi di 64kb ... qualsiasi idea su come farei di impostare MaxReceivedmedageSesize per un customBinding o come assicurare il tuo legame viene impostato su un webhttpbinding.

P.S.Ho bisogno di farlo a livello programmatico, quindi le impostazioni .Config non saranno di utilizzo a me.

È stato utile?

Soluzione

Okay, quindi dopo aver scavato lungo e duro su questo, questo è ciò che ho trovato:

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

funziona, anche se può essere sicuramente migliorato.Ho ancora bisogno di vedere se c'è un modo più generico di maneggiare questo, piuttosto che separare i casi per tipo.Sebbene al momento non vedo alcun altro modo per farlo (dal momento che il tipo di rilegatura si basa sui metodi nel servizio stesso, ricordare che è passato solo da WebHttpninding al customBinding quando ho aggiunto un parametro Stream a uno dei metodi di servizio).

    .
  • Se qualcuno ha altre intuizioni su questo argomento, per favore dopo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top