WCF: (MMD) est-il possible de changer le schéma utilisé dans xop: Contenu uri de référence générés par WCF?

StackOverflow https://stackoverflow.com/questions/2280025

  •  21-09-2019
  •  | 
  •  

Question

WCF utilise http://tempuri/1/number pour uri références Content-ID lors de la manipulation des demandes transmises en continu MMD.

Est-il possible comment forcer WCF à utiliser une autre références Content-ID pour le xop: Inclure

Arrière-plan du problème:

Je construis un client .NET pour MMD activé service Web JAX ws java qui gère ruisselait gros téléchargements de données. J'ai fabriqué à la main les contacts de service et de données (les contrats générés WSDL ne sont pas corrects et ne permettait pas le streaming).

Le problème est que le service Web (JAX ws) ne reçoit pas le corps de la requête contenant les données.

Il reçoit les données qui sont transférées en-têtes.

Nous avons construit un client java pour les ws -. Celui-ci fonctionne

Je l'ai capturé et comparé le trafic HTTP lors de l'émission des demandes de java et WCF, et la seule différence est dans la façon dont la référence Content-ID est généré lors de la publication des données multipart:

  • WCF utilise des références http://tempuri/1/... Content-ID qui donnent de la valeur encodée, comme href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634019957020047928"

  • Java client utilise "style e-mail" de uri, comme href="cid:3f3ec388-8cd9-47aa-a603-fb1bc17935b8@example.jaxws.sun.com"

Ces rendements dans le xop-inclut suivante (données est le seul élément dans le corps de savon) ( XOP comprend la spécification )


//WCF:
<Data>
   <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634019957020047928" />
</Data>

//JAVA:
<Data>
    <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:3f3ec388-8cd9-47aa-a603-fb1bc17935b8@example.jaxws.sun.com"/>
</Data>

plus tard, dans les données multipart, le contenu est appelé par unencoded Content-ID:

--uuid:7e166bb7-042f-4ba3-b6ef-98fbbc21244b+id=1
Content-ID: <http://tempuri.org/1/634019957020047928>
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream

Je suppose qu'il ya peut un bogue dans le cadre de services Web JAX et il ne reconnaît pas WCF générés + urlencoded Content-ID références uri.

Est-il possible comment forcer WCF à utiliser une autre références Content-ID pour le xop: Inclure


EDIT:. Je l'ai trouvé le XmlMtomWriter qui a la méthode GenerateUriForMimePart, il est utilisé pour générer Content-ID

public static string GenerateUriForMimePart(int index)
{
    return string.Format(CultureInfo.InvariantCulture, 
"http://tempuri.org/{0}/{1}", new object[] { index, DateTime.Now.Ticks });
}

Il ne semble pas que la génération d'identité est de quelque façon que Overridable.

Une question similaire est décrite ici, la réponse fournie ne permet pas: http://social.msdn.microsoft.com/Forums/en/wcf/thread/f90affbd-f431-4602-a81d-cc66c049e351

Était-ce utile?

La solution

Asnwering à moi-même après une longue enquête. Pas possible sans réimplémentant l'ensemble XmlMtomWriter et d'autres couches et préoccupations liées à WCF - presque tout ce qui concerne la mise en œuvre de MMD est interne

Autres conseils

Je sais qu'il est une vieille question. Mais je suis confronté au même problème il y a deux jours.

J'ai trouvé un moyen qui fonctionne, mais il est très très sale bidouille (je le sais. Je pensais à ne pas publier ici, mais peut-être que cela aiderait quelqu'un.) Nous espérons que vous ne me le reprocher.

Le contentId est formaté avec l'utilisation de CultureInfo.InvariantCulture. Je ne trouve pas un moyen officiel pour le remplacer par une coutume CultureInfo. Mais avec l'aide de la réflexion, je l'ai eu en cours d'exécution. La mise en œuvre suivante est seulement pour .NET 4.0.

public class NoTempUriInvariantCultureInfo : CultureInfo, ICustomFormatter
{
   private static CultureInfo originalCulture;
   private static object originalCultureLock;
   private static int enableCounter;

   private NoTempUriInvariantCultureInfo(CultureInfo invariantCulture)
      : base(invariantCulture.Name)
   {
      originalCulture = invariantCulture;
   }

   public static void Enable()
   {
      if(originalCultureLock == null)
         originalCultureLock = new object();

      lock (originalCultureLock)
      {
         if (enableCounter == 0)
         {
            var mInvCultField = typeof (CultureInfo).GetField("s_InvariantCultureInfo", BindingFlags.NonPublic | BindingFlags.Static);
            mInvCultField.SetValue(null, new NoTempUriInvariantCultureInfo(CultureInfo.InvariantCulture));
         }
         enableCounter++;
      }
   }

   public static void Disable()
   {
      lock (originalCulture)
      {
         if (enableCounter == 0)
            return;

         enableCounter--;
         if (enableCounter == 0)
         {
            var mInvCultField = typeof (CultureInfo).GetField("s_InvariantCultureInfo", BindingFlags.NonPublic | BindingFlags.Static);
            mInvCultField.SetValue(null, NoTempUriInvariantCultureInfo.originalCulture);
         }
      }
   }

   public override object GetFormat(Type formatType)
   {
      var result = originalCulture.GetFormat(formatType);
      return result ?? this;
   }

   public string Format(string format, object arg, IFormatProvider formatProvider)
   {
      if (format == null)
         return System.Text.RegularExpressions.Regex.Replace(arg.ToString().Replace("http%3A%2F%2Ftempuri.org%2F1%2F", ""), "http[:][/][/]tempuri[.]org[/][0-9]+[/]*", "");
      return String.Format("{0:" + format + "}", arg);
   }
}

activer mon propre "InvariantCulture" seulement avant un appel WCF.

NoTempUriInvariantCultureInfo.Enable();
try
{
    // make your call
}
finally
{
    NoTempUriInvariantCultureInfo.Disable();
}

CultureInfo.InvariantCulture est un objet global de l'Etat. L'activation de mon propre InvariantCulture affecte tous les fils. Encore une fois, il est un sale hack. Mais cela fonctionne.

Tant du XOP comprend des échantillons que vous avez indiqués sont corrects et acceptable selon le W3C. Je les décrirais comme le format d'URL et le format Email respectivement.

Je ne suis pas un développeur JAVA, mais rappelle un problème similaire lors de l'interfaçage avec un particulier service Web JAVA. Je me souviens qu'il y ait un bug dans une version JAVA particulière et après (les développeurs JAVA) mis à niveau vers la prochaine version, cette question se sont tout simplement. Je voudrais pouvoir vous fournir plus de détails, mais à l'époque, pour moi il y a assez de problèmes devaient porter sur de mon bout du fil et je suis juste heureux d'avoir un moins article sur le journal des défauts.

//WCF: using URL format
<Data>
   <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634019957020047928" />
</Data>

//JAVA: using EMAIL format
<Data>
    <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:3f3ec388-8cd9-47aa-a603-fb1bc17935b8@example.jaxws.sun.com"/>
</Data>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top