Asynchronous 异步WCF调用抛出ServiceModel.ActionNotSupportedException

Asynchronous 异步WCF调用抛出ServiceModel.ActionNotSupportedException,asynchronous,wcf,Asynchronous,Wcf,我正在编写一个WCF客户端,它读取固件文件,将其复制到字节数组并将其发送到WCF服务器。服务器将其闪存到与之连接的其他设备。服务器和客户端都是我写的 我在代码中创建了一个WCF服务,没有使用configuration.xml中的服务模型配置部分。由于服务器可能需要一分钟来刷新,所以我将契约实现为异步的,这样客户端就不需要等到刷新完成。服务器和客户端共享相同的IFirmwareUpgrade接口 但是,当我运行客户机和服务器时,我会得到ServiceModel.ActionNotSupported

我正在编写一个WCF客户端,它读取固件文件,将其复制到字节数组并将其发送到WCF服务器。服务器将其闪存到与之连接的其他设备。服务器和客户端都是我写的

我在代码中创建了一个WCF服务,没有使用configuration.xml中的服务模型配置部分。由于服务器可能需要一分钟来刷新,所以我将契约实现为异步的,这样客户端就不需要等到刷新完成。服务器和客户端共享相同的IFirmwareUpgrade接口

但是,当我运行客户机和服务器时,我会得到ServiceModel.ActionNotSupportedException异常。以下是例外情况的详细信息

The message with Action 'ServiceContractNS/UpdatorContract/UpgradeFirmware' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher.This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
这是服务器代码

namespace Updator
   {
    partial class UpdatorWCFService : IUpdator, IFirmwareUpgrade
    {
        public bool UpgradeFirmware(string deviceIPAddress, byte[] buffer)
        {
            m_RFM220Manager.UpgradeFirmware(deviceIPAddress, buffer);
            return true;
        }

        public System.IAsyncResult BeginUpgradeFirmware(string DeviceIPAddress, byte[] buffer, System.AsyncCallback callback, object asyncState)
        {
            Console.WriteLine("BeginServiceAsyncMethod called with: \"{0}\"", DeviceIPAddress);
            //Do something
            return new CompletedAsyncResult<bool>(true);            
        }

        public bool EndUpgradeFirmware(System.IAsyncResult r)
        {
            CompletedAsyncResult<bool> result = r as CompletedAsyncResult<bool>;
            Console.WriteLine("EndServiceAsyncMethod called with: \"{0}\"", result.Data);
            //return result.Data;
            return false;
        }       
    }

    // Simple async result implementation.
    class CompletedAsyncResult<T> : IAsyncResult
    {
        T data;

        public CompletedAsyncResult(T data)
        { this.data = data; }

        public T Data
        { get { return data; } }

        #region IAsyncResult Members
        public object AsyncState
        { get { return (object)data; } }

        public WaitHandle AsyncWaitHandle
        { get { throw new Exception("The method or operation is not implemented."); } }

        public bool CompletedSynchronously
        { get { return true; } }

        public bool IsCompleted
        { get { return true; } }
        #endregion
    }
}
这是合同

[ServiceContract(Name = "UpdatorContract", Namespace = "ServiceContractNS", ConfigurationName = "UpdatorContract")]
    public interface IFirmwareUpgrade
    {
        [OperationContract]
        bool UpgradeFirmware(string DeviceIPAddress, byte[] buffer);

        //[System.ServiceModel.OperationContractAttribute(AsyncPattern = true, Action = "ServiceContractNS/UpdatorContract/UpgradeFirmware", ReplyAction = "ServiceContractNS/UpdatorContract/UpgradeFirmwareResponse")]
        [OperationContract(AsyncPattern=true)]
        System.IAsyncResult BeginUpgradeFirmware(string DeviceIPAddress, byte[] buffer, System.AsyncCallback callback, object asyncState);

        // Note: There is no OperationContractAttribute for the end method.
        bool EndUpgradeFirmware(System.IAsyncResult result);
    }
这是客户端中的configsection

  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBinding_UpdatorContract" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
            hostNameComparisonMode="StrongWildcard" listenBacklog="10"
            maxBufferPoolSize="20971520" maxBufferSize="20971520" maxConnections="10"
            maxReceivedMessageSize="20971520">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
              enabled="false" />
          <security mode="None">
            <transport clientCredentialType="None" protectionLevel="None" />
            <message clientCredentialType="None" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <client>
      <endpoint address="net.tcp://192.158.96.120:8000/Updator/UpdatorWCFService"
          binding="netTcpBinding" bindingConfiguration="NetTcpBinding_UpdatorContract"
          contract="UpdatorContract" name="NetTcpBinding_UpdatorContract" />
    </client>
  </system.serviceModel>

这是异步实现的客户机类

public class FirmwareUpgradeClient : System.ServiceModel.ClientBase<IFirmwareUpgrade>, IFirmwareUpgrade
    {
        private BeginOperationDelegate onBeginUpgradeFirmwareDelegate;

        private EndOperationDelegate onEndUpgradeFirmwareDelegate;

        private System.Threading.SendOrPostCallback onUpgradeFirmwareCompletedDelegate;

        public event System.EventHandler<UpgradeFirmwareCompletedEventArgs> UpgradeFirmwareCompleted;

        public bool UpgradeFirmware(string DeviceIPAddress, byte[] buffer)
        {
            return base.Channel.UpgradeFirmware(DeviceIPAddress, buffer);
        }

        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        public System.IAsyncResult BeginUpgradeFirmware(string DeviceIPAddress, byte[] buffer, System.AsyncCallback callback, object asyncState)
        {
            return base.Channel.BeginUpgradeFirmware(DeviceIPAddress, buffer, callback, asyncState);
        }

        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        public bool EndUpgradeFirmware(System.IAsyncResult result)
        {
            return base.Channel.EndUpgradeFirmware(result);
        }

        private System.IAsyncResult OnBeginUpgradeFirmware(object[] inValues, System.AsyncCallback callback, object asyncState)
        {
            string DeviceIPAddress = ((string)(inValues[0]));
            byte[] buffer = ((byte[])(inValues[1]));
            return this.BeginUpgradeFirmware(DeviceIPAddress, buffer, callback, asyncState);
        }

        private object[] OnEndUpgradeFirmware(System.IAsyncResult result)
        {
            bool retVal = this.EndUpgradeFirmware(result);
            return new object[] {
                retVal};
        }

        private void OnUpgradeFirmwareCompleted(object state)
        {
            if ((this.UpgradeFirmwareCompleted != null))
            {
                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
                this.UpgradeFirmwareCompleted(this, new UpgradeFirmwareCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
            }
        }

        public void UpgradeFirmwareAsync(string DeviceIPAddress, byte[] buffer)
        {
            this.UpgradeFirmwareAsync(DeviceIPAddress, buffer, null);
        }

        public void UpgradeFirmwareAsync(string DeviceIPAddress, byte[] buffer, object userState)
        {
            try
            {
                if ((this.onBeginUpgradeFirmwareDelegate == null))
                {
                    this.onBeginUpgradeFirmwareDelegate = new BeginOperationDelegate(this.OnBeginUpgradeFirmware);
                }
                if ((this.onEndUpgradeFirmwareDelegate == null))
                {
                    this.onEndUpgradeFirmwareDelegate = new EndOperationDelegate(this.OnEndUpgradeFirmware);
                }
                if ((this.onUpgradeFirmwareCompletedDelegate == null))
                {
                    this.onUpgradeFirmwareCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnUpgradeFirmwareCompleted);
                }
                base.InvokeAsync(this.onBeginUpgradeFirmwareDelegate, new object[] {
                    DeviceIPAddress,
                    buffer}, this.onEndUpgradeFirmwareDelegate, this.onUpgradeFirmwareCompletedDelegate, userState);
            }
            catch (Exception e)
            {

            }
        }

    }
公共类FirmwareUpgradeClient:System.ServiceModel.ClientBase,IFirmwareUpgrade
{
BeginUpgradeFirmwareLegate上的private BeginOperationDelegate;
私人内部运营代表,高级公司授权代表;
private System.Threading.SendOrPostCallback onUpgradeFirmwareCompletedDelegate;
public event System.EventHandler升级firmwarecompleted;
公共bool升级固件(字符串DeviceIPAddress,字节[]缓冲区)
{
返回base.Channel.UpgradeFirmware(DevicePaddress,缓冲区);
}
[System.ComponentModel.EditorBrowsBalAttribute(System.ComponentModel.EditorBrowsBalState.Advanced)]
public System.IAsyncResult BeginUpgradeFirmware(字符串DeviceIPAddress,字节[]缓冲区,System.AsyncCallback回调,对象asyncState)
{
返回base.Channel.BeginUpgradeFirmware(DeviceIPAddress、缓冲区、回调、异步状态);
}
[System.ComponentModel.EditorBrowsBalAttribute(System.ComponentModel.EditorBrowsBalState.Advanced)]
public bool endupgrade固件(System.IAsyncResult结果)
{
返回base.Channel.endupgrade固件(结果);
}
private System.IAsyncResult OnBeginUpgradeFirmware(对象[]无效,System.AsyncCallback回调,对象asyncState)
{
字符串DeviceIPAddress=((字符串)(无效[0]);
字节[]缓冲区=((字节[])(无效[1]);
返回此.BeginUpgradeFirmware(DeviceIPAddress、缓冲区、回调、异步状态);
}
私有对象[]固件(System.IAsyncResult结果)
{
bool retVal=此.endUpgrade固件(结果);
返回新对象[]{
retVal};
}
私有void OnUpgradeFirmwareCompleted(对象状态)
{
如果((this.UpgradeFirmwareCompleted!=null))
{
InvokeAsyncCompletedEventArgs e=((InvokeAsyncCompletedEventArgs)(状态));
this.UpgradeFirmwareCompleted(此,新的UpgradeFirmwareCompletedEventArgs(e.Results,e.Error,e.Cancelled,e.UserState));
}
}
public void UpgradeFirmwareAsync(字符串DeviceIPAddress,字节[]缓冲区)
{
这个.UpgradeFirmwareAsync(DeviceIPAddress,buffer,null);
}
public void UpgradeFirmwareAsync(字符串DeviceIPAddress,字节[]缓冲区,对象userState)
{
尝试
{
if((this.onBeginUpgradeFirmwareDelegate==null))
{
this.onBeginUpgradeFirmwareDelegate=新的BeginOperationDelegate(this.OnBeginUpgradeFirmware);
}
if((this.onEndUpgradeFirmwareDelegate==null))
{
this.onendupgrade firmwaredelegate=新的内部操作委派(this.onendupgrade固件);
}
if((this.onUpgradeFirmwareCompletedDelegate==null))
{
this.onUpgradeFirmwareCompletedDelegate=new System.Threading.SendOrPostCallback(this.OnUpgradeFirmwareCompleted);
}
base.InvokeAsync(this.onBeginUpgradeFirmwareDelegate,新对象[]{
DevicePaddress,
buffer},this.onEndUpgradeFirmwareDelegate,this.onUpgradeFirmwareCompletedDelegate,userState);
}
捕获(例外e)
{
}
}
}

这里有一个猜测:可能是您将名称或命名空间添加到了ServiceContract中,而没有重新编译服务器和客户端?请注意,这两个都必须重新编译才能正常工作:如果您只是重新编译服务器,您将得到您引用的错误。确保客户端项目具有正确的接口,包括所有属性。我认为您需要使用IFirmwareUpgrade m_UITCPHost.AddServiceEndpoint(typeof(IUpdator),binding,“UpdaterWCFService”);
public class FirmwareUpgradeClient : System.ServiceModel.ClientBase<IFirmwareUpgrade>, IFirmwareUpgrade
    {
        private BeginOperationDelegate onBeginUpgradeFirmwareDelegate;

        private EndOperationDelegate onEndUpgradeFirmwareDelegate;

        private System.Threading.SendOrPostCallback onUpgradeFirmwareCompletedDelegate;

        public event System.EventHandler<UpgradeFirmwareCompletedEventArgs> UpgradeFirmwareCompleted;

        public bool UpgradeFirmware(string DeviceIPAddress, byte[] buffer)
        {
            return base.Channel.UpgradeFirmware(DeviceIPAddress, buffer);
        }

        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        public System.IAsyncResult BeginUpgradeFirmware(string DeviceIPAddress, byte[] buffer, System.AsyncCallback callback, object asyncState)
        {
            return base.Channel.BeginUpgradeFirmware(DeviceIPAddress, buffer, callback, asyncState);
        }

        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        public bool EndUpgradeFirmware(System.IAsyncResult result)
        {
            return base.Channel.EndUpgradeFirmware(result);
        }

        private System.IAsyncResult OnBeginUpgradeFirmware(object[] inValues, System.AsyncCallback callback, object asyncState)
        {
            string DeviceIPAddress = ((string)(inValues[0]));
            byte[] buffer = ((byte[])(inValues[1]));
            return this.BeginUpgradeFirmware(DeviceIPAddress, buffer, callback, asyncState);
        }

        private object[] OnEndUpgradeFirmware(System.IAsyncResult result)
        {
            bool retVal = this.EndUpgradeFirmware(result);
            return new object[] {
                retVal};
        }

        private void OnUpgradeFirmwareCompleted(object state)
        {
            if ((this.UpgradeFirmwareCompleted != null))
            {
                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
                this.UpgradeFirmwareCompleted(this, new UpgradeFirmwareCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
            }
        }

        public void UpgradeFirmwareAsync(string DeviceIPAddress, byte[] buffer)
        {
            this.UpgradeFirmwareAsync(DeviceIPAddress, buffer, null);
        }

        public void UpgradeFirmwareAsync(string DeviceIPAddress, byte[] buffer, object userState)
        {
            try
            {
                if ((this.onBeginUpgradeFirmwareDelegate == null))
                {
                    this.onBeginUpgradeFirmwareDelegate = new BeginOperationDelegate(this.OnBeginUpgradeFirmware);
                }
                if ((this.onEndUpgradeFirmwareDelegate == null))
                {
                    this.onEndUpgradeFirmwareDelegate = new EndOperationDelegate(this.OnEndUpgradeFirmware);
                }
                if ((this.onUpgradeFirmwareCompletedDelegate == null))
                {
                    this.onUpgradeFirmwareCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnUpgradeFirmwareCompleted);
                }
                base.InvokeAsync(this.onBeginUpgradeFirmwareDelegate, new object[] {
                    DeviceIPAddress,
                    buffer}, this.onEndUpgradeFirmwareDelegate, this.onUpgradeFirmwareCompletedDelegate, userState);
            }
            catch (Exception e)
            {

            }
        }

    }