带两个“并行”代理的System.ServiceModel.ProtocolException

问题描述:

我的web服务一直运行良好,很难说我做了什么,导致它们不时崩溃。我添加了HTTP Basic Authentication和交换数据库提供程序,从ObjectDB到MySQL,因此性能下降,但这似乎不相关。带两个“并行”代理的System.ServiceModel.ProtocolException

我使用启用了MTOM流的GlassFish v3.1托管SSL保护的Java Metro Web服务。我用WCF客户端调用它们。即使我使用相同的参数调用相同的服务,该例外也会随机发生。

UPDATE有时它只是表现得像成功建立呼叫,然后不管我打电话给该服务,即使有helloWorld,我发现了异常。如果我只拨打其中一个代理,呼叫就会很好,但例如,如果我拨打dataMiningClient,然后拨打dataStoreClient,我会得到例外。线程安全?

请参见:

private void button1_Click(object sender, EventArgs e) 
{ 
    richTextBox1.Text = ""; 

    DataStoreWSClient dataStoreClient = getDataStoreClient(email, password); 
    DataMiningWSClient dataMiningClient = getDataMiningClient(email, password); 

    byte[] dataSet = File.ReadAllBytes(textBox1.Text); 
    string dataSetName = Path.GetFileName(textBox1.Text); 
    long checkSum = getCheckSumForDataSet(dataSet); 

    //WS Call 
    try 
    { 
     //Example: 
     //The second time I click on this button, 
     //this is the point where I get the ProtocolException 
     bool checkSumResponse = dataStoreClient.checkDataSet(checkSum); 

     //checkSumResponse was always true when I was debugging this 
     //So no MTOM streaming involved 
     if (checkSumResponse) 
     { 
      richTextBox1.Text = dataMiningClient.kNearestNeighbour(checkSum, notifyByEmail); 
     } 
     else 
     { 
      richTextBox1.Text = dataMiningClient.kNearestNeighbourMTOM(dataSetName, notifyByEmail, dataSet); 
     } 
    } 
    catch (Exception ex) 
    { 
     //MessageBox.Show(ex.ToString()); 
     richTextBox1.Text = ex.ToString(); 
    } 

    dataMiningClient.Close(); 
    dataStoreClient.Close(); 
} 

我没有在服务器端的错误消息。

这是异常消息我得到:

System.ServiceModel.ProtocolException:内容类型多部分/相关;起始= “”;类型= “应​​用/ XOP + xml” 的;边界=“UUID :d64b0098-0dcb-4da4-a047-d305b55da9f5“;响应消息的start-info =”text/xml“与绑定的内容类型(text/xml; charset = utf-8)不匹配。如果使用自定义编码器,请确保IsContentTypeSupported方法正确实施。响应的前1024个字节为:'--uuid:d64b0098-0dcb-4da4-a047-d305b55da9f5 Content-Id: Content-Type:application/xop + xml; charset = utf-8; type =“text/XML” 内容传输编码:二进制

<?xml version='1.0' encoding='UTF-8'?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
      xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <S:Header> 
      <To xmlns="http://www.w3.org/2005/08/addressing">http://www.w3.org/2005/08/addressing/anonymous</To> 
      <Action xmlns="http://www.w3.org/2005/08/addressing" 
        xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
        S:mustUnderstand="1">http://webServices/DataStoreWS/checkDataSetResponse</Action> 
      <MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:1cbcfdc6-01e4-4ddc-960d-a9a2d4e3021a</MessageID> 
      <RelatesTo xmlns="http://www.w3.org/2005/08/addressin'. sender, EventArgs e) in F:\2.0\WSClient3.5ServiceRef\WSClient3.5\Form1.cs:line 51 

Server stack trace: 
    at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException, ChannelBinding channelBinding) 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at WSClient3._5.DataStore.DataStoreWS.checkDataSet(checkDataSetRequest request) 
    at WSClient3._5.DataStore.DataStoreWSClient.WSClient3._5.DataStore.DataStoreWS.checkDataSet(checkDataSetRequest request) in F:\Dropbox\Suli\MSc\DIPLOMA_MSc\JavaWSJMX\2.0\WSClient3.5ServiceRef\WSClient3.5\Service References\DataStore\Reference.cs:line 1227 
    at WSClient3._5.DataStore.DataStoreWSClient.checkDataSet(Int64 checkSum) in F:\Dropbox\Suli\MSc\DIPLOMA_MSc\JavaWSJMX\2.0\WSClient3.5ServiceRef\WSClient3.5\Service References\DataStore\Reference.cs:line 1233 
    at WSClient3._5.Form1.button1_Click(Object sender, EventArgs e) in F:\Dropbox\Suli\MSc\DIPLOMA_MSc\JavaWSJMX\2.0\WSClie 

客户端代码

DataMiningWSClient getDataMiningClient(String username, String password) 
{ 
    //IMPORTANT - THIS LINE IS ONLY FOR TESTING PURPOSES! 
    //This code is for accepting self-signed server certificate 
    ServicePointManager.ServerCertificateValidationCallback += (sender_ws, cert, chain, sslPolicyErrors) => true; 

    //instantiate transport binding element, leave the defaults 
    HttpsTransportBindingElement transport = new HttpsTransportBindingElement(); 
    transport.MaxReceivedMessageSize = 2147483647; 
    transport.AuthenticationScheme = AuthenticationSchemes.Basic; 

    //instantiate message encoding element, where message version must be Soap11WSAddressing10 to match metro web service requirement. 
    MtomMessageEncodingBindingElement mtom = new MtomMessageEncodingBindingElement(); 
    mtom.WriteEncoding = System.Text.Encoding.UTF8; 
    mtom.MessageVersion = MessageVersion.Soap11WSAddressing10; 
    mtom.MaxBufferSize = 2147483647; 
    mtom.ReaderQuotas.MaxStringContentLength = 2147483647; 

    //instantiate transport security binding element, with all the suggested values in app.config 
    TransportSecurityBindingElement b_element = new TransportSecurityBindingElement(); 
    b_element.DefaultAlgorithmSuite = new Basic128SecurityAlgorithmSuite(); 
    b_element.IncludeTimestamp = true; 
    b_element.KeyEntropyMode = SecurityKeyEntropyMode.CombinedEntropy; 
    b_element.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11; 
    b_element.SecurityHeaderLayout = SecurityHeaderLayout.Lax; 

    //instantiate the custom binding and add the elements created above 
    CustomBinding customBinding = new CustomBinding(); 
    customBinding.Name = "myOwnPersonalCustomBinding"; 
    customBinding.Elements.Add(b_element); 
    customBinding.Elements.Add(mtom); 
    customBinding.Elements.Add(transport); 

    //instantiate the client 
    DataMiningWSClient DMclient = new DataMiningWSClient(customBinding, new EndpointAddress(new Uri("https://localhost:8181/DataMiner/DataMiner"))); 
    setCredentials(username, password, DMclient.ClientCredentials); 
    return DMclient; 
} 

任何提示,这可能是这里的问题?请告诉我是否应该用更多的信息来扩展这个问题;我可能会深入研究WCF消息日志。

ProtocolException的原因:我没有将两个代理配置为MtomMessageEncodingBindingElement,但是这两个服务都使用@MTOM注释进行定义。

它定义为两个代理服务器后,一切都工作得很好:

//instantiate message encoding element, where message version must be Soap11WSAddressing10 to match metro web service requirement. 
MtomMessageEncodingBindingElement mtom = new MtomMessageEncodingBindingElement(); 
mtom.WriteEncoding = System.Text.Encoding.UTF8; 
mtom.MessageVersion = MessageVersion.Soap11WSAddressing10; 
mtom.MaxBufferSize = 2147483647; 
mtom.ReaderQuotas.MaxStringContentLength = 2147483647;