Hello.  I'm in the process of writing an MTOM extension of SoapHttpClientProtocol and I've run into a slight snag.  Part of my code involves overriding GetWebResponse() and replacing the Content-Type header (which is, for MTOM-encoded stuff, 'application/xop+xml') with 'text/xml' for the sake of the lower layers that don't know that they're actually supporting MTOM.  Here's the line of code I use:
<br><br>&nbsp;&nbsp; rsp.Headers[HttpResponseHeader.ContentType] = &quot;text/xml&quot;;<br><br>In WebHeaderCollection, however, this setter ends up doing an Add().&nbsp; Its NameValueCollection, in turn, adds &#39;,text/xml&#39; to the &quot;Content-Type&quot; key as it&#39;s supposed to.&nbsp; So the content type turns out to be:
<br><br>&nbsp;&nbsp; &lt;original content type&gt;,text/xml<br><br>When WebServiceHelper tries to decode this to get the encoding, it doesn&#39;t expect the comma-delimited types and ends up returning something invalid like:<br><br>
&nbsp;&nbsp; utf-8&quot;,text/xml<br><br>Now, I could manually remove and re-set the Content-Type header in the WebHeaderCollection.&nbsp; But I don&#39;t think I should have to!&nbsp; For one, this code works as intended under .NET.&nbsp; Second, WebHeaderCollection already has a list of those headers that are allowed to contain multiple values in their NameValue string - it stores them in a hash table called &#39;multiValue&#39;.&nbsp; The private method SetInternal() checks this hash table to see whether an incoming name/value pair should replace the existing header (ie. do a Remove()/Set()) or just add it (ie. do an Add()).&nbsp; Content-Type is not a multi-value header, so it seems to me that simply using the setter should replace it.
<br><br>My proposed change, finally, is to call the SetInternal() method in the setters instead of Add():<br><br>&nbsp;&nbsp; public string this[HttpRequestHeader hrh]<br>
&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp; get { ... }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { SetInternal (ResponseHeaderToString (hrh), value); }<br>
&nbsp;&nbsp; }<br>
<br clear="all">&nbsp;&nbsp; public string this[HttpResponseHeader hrh]<br>
&nbsp;&nbsp; {<br>
&nbsp;&nbsp; &nbsp;&nbsp; get { ... }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { SetInternal (ResponseHeaderToString (hrh), value); }<br>
&nbsp;&nbsp; }<br>
<br>Please let me know if I&#39;m missed something or if I can provide more information, and my apologies for the long-winded explanation!<br clear="all"><br>-- <br>Jay Miller<br>PGP Fingerprint | 5f7adbbe bfc60727 96dca94c 616d5080 09e3e846