Question

I am using an webserviceinvoking class to call SAP PI from a .NET with C# Service.

I am using the following method to do this:

public object InvokeMethod(string serviceName, string methodName, params object[] args)
{
    System.ServiceModel.Channels.Binding defaultBinding = new BasicHttpBinding(BasicHttpSecurityMode.None);
    if (this.credentials != null)
    {
        ((BasicHttpBinding)defaultBinding).Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        ((BasicHttpBinding)defaultBinding).Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; //.Ntlm;
    }

    object obj = this.webServiceAssembly.CreateInstance(serviceName, false, BindingFlags.CreateInstance, null, new object[] { defaultBinding, new EndpointAddress(this.webServiceUri.ToString()) }, null, null);

    Type type = obj.GetType();

    if (this.credentials != null)
    {
        PropertyInfo piClientCreds = type.GetProperty("ClientCredentials");
        ClientCredentials creds = (ClientCredentials)piClientCreds.GetValue(obj, null);
        creds.UserName.UserName = this.credentials.UserName;
        creds.UserName.Password = this.credentials.Password;
    }

    return type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, args);
}

However calling it gives me an Unrecognized message version. exception:

{System.ServiceModel.CommunicationException: Unrecognized message version.

Server stack trace: 
   at System.ServiceModel.Channels.ReceivedMessage.ReadStartEnvelope(XmlDictionaryReader reader)
   at System.ServiceModel.Channels.BufferedMessage..ctor(IBufferedMessageData messageData, RecycledMessageState recycledMessageState, Boolean[] understoodHeaders, Boolean understoodHeadersModified)
   at System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.ReadMessage(ArraySegment`1 buffer, BufferManager bufferManager, String contentType)
   at System.ServiceModel.Channels.MessageEncoder.ReadMessage(Stream stream, BufferManager bufferManager, Int32 maxBufferSize, String contentType)
   at System.ServiceModel.Channels.HttpInput.ReadChunkedBufferedMessage(Stream inputStream)
   at System.ServiceModel.Channels.HttpInput.ParseIncomingMessage(Exception& requestException)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.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 SIOS_Sync_CRMAccount.SIOS_Sync_CRMAccount(SIOS_Sync_CRMAccountRequest request)
   at SIOS_Sync_CRMAccountClient.SIOS_Sync_CRMAccount.SIOS_Sync_CRMAccount(SIOS_Sync_CRMAccountRequest request)
   at SIOS_Sync_CRMAccountClient.SIOS_Sync_CRMAccount(DT_CRMAccount MT_Sync_CRMAccount_request)}

Wireshark XML output to webservice:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <MT_Sync_CRMAccount_request xmlns="http://microsoft.com/crm/accounts">
            <recordActionType xmlns="">1</recordActionType>
            <accountnumber xmlns="">3000016</accountnumber>
            <name xmlns="">Test CRM2SAP16</name>
        </MT_Sync_CRMAccount_request>
    </s:Body>
</s:Envelope>

Any help is much appreciated.

Était-ce utile?

La solution

SAP Pi seems to have two URL's. One for the WSDL and the other for the call. The default binding has to be changed in order to get it working to the service url defined in the port list from the WSDL.

object obj = this.webServiceAssembly.CreateInstance(
               serviceName, 
               false, 
               BindingFlags.CreateInstance, 
               null, 
               new object[] { 
                              defaultBinding, 
                              new EndpointAddress(this.webServiceUri.ToString()) 
                            }, 
               null,  
               null);

Autres conseils

Normally we(SAP PI Team) provide WSDL file which is generated from SAP PI to the partners to consume and the end point URL also we share with partners along with the WSDL so check with your SAP PI team for the WSDL and end point URL.

Also note that, if they have changed any thing/object related to this flow at SAP PI, they need to provide you new WSDL and also ensure that the user is having access to the SAP PI to push the message from your end.(other areas incase applicable., certificates).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top