找不到合适的WCF端点配置

时间:2014-08-19 07:30:13

标签: web-services wcf endpoint

我创建了从android获取数据的服务并将它们保存到SQL中。我正在使用IIS 7

我的代码:

namespace WcfService_SuiviColis
{
    // REMARQUE : vous pouvez utiliser la commande Renommer du menu Refactoriser pour changer le nom d'interface "IService1" à la fois dans le code et le fichier de configuration.
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat= WebMessageFormat.Json,  BodyStyle =WebMessageBodyStyle.Wrapped,  UriTemplate = "SaveData")]
        void SaveData(Pers_Ordre_NET oData);      
    }

    [DataContract]
    public class Pers_Ordre_NET
    {
        [DataMember]
        string _CodeClient;
        public string CodeClient
        {
            get { return _CodeClient; }
            set { _CodeClient = value; }
        }

       [DataMember]
        string _CodeDest;
        public string CodeDest
        {
            get { return _CodeDest; }
            set { _CodeDest = value; }
        }

        [DataMember]
        string _NoOrdre;
        public string NoOrdre
        {
            get { return _NoOrdre; }
            set { _NoOrdre = value; }
        }

        [DataMember]
        string _DateTampon;
        public string DateTampon
        {
            get { return _DateTampon; }
            set { _DateTampon = value; }
        }

        [DataMember]
        string _GeoPos;
        public string GeoPos
        {
            get { return _GeoPos; }
            set { _GeoPos = value; }
        }

        [DataMember]
        string _StsOrdre;
        public string StsOrdre
        {
            get { return _StsOrdre; }
            set { _StsOrdre = value; }
        }

        [DataMember]
        string _Camion;
        public string Camion
        {
            get { return _Camion; }
            set { _Camion = value; }
        }
    }
}

service.svc.cs

namespace WcfService_SuiviColis
{
    // REMARQUE : vous pouvez utiliser la commande Renommer du menu Refactoriser pour changer le nom de classe "Service1" dans le code, le fichier svc et le fichier de configuration.
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1 : IService1
    {
        public void SaveData(Pers_Ordre_NET oOrdre)
        {
            try
            {
                using (var connectionWrapper = new Connexion())
                {
                    var connectedConnection = connectionWrapper.GetConnected();
                    string sql_Adding = "INSERT INTO [SUIVI_ORDRE]"+
                                          " ([CODE_CLIENT] ,[CODE_DEST],[NO_ORDRE],[DATE_TAMPON],[GPS_POS],[STATUS_ORDRE],CAMION)"+
                                    "VALUES (@CODE_CLIENT,@CODE_DEST,@NO_ORDRE,@DATE_TAMPON,@GPS_POS,@STATUS_ORDRE,@CAMION)";
                    SqlCommand comm_Insrt = new SqlCommand(sql_Adding, connectionWrapper.conn);
                    comm_Insrt.Parameters.AddWithValue("@CODE_CLIENT", oOrdre.CodeClient);
                    comm_Insrt.Parameters.AddWithValue("@CODE_DEST", oOrdre.CodeDest);
                    comm_Insrt.Parameters.AddWithValue("@NO_ORDRE", oOrdre.NoOrdre);
                    comm_Insrt.Parameters.AddWithValue("@DATE_TAMPON", oOrdre.DateTampon);
                    comm_Insrt.Parameters.AddWithValue("@GPS_POS", oOrdre.GeoPos);
                    comm_Insrt.Parameters.AddWithValue("@STATUS_ORDRE", oOrdre.StsOrdre);
                    comm_Insrt.Parameters.AddWithValue("@CAMION", oOrdre.Camion);
                    comm_Insrt.ExecuteNonQuery();                   
                }
            }
            catch (Exception excThrown)
            {
                throw new Exception(excThrown.Message);
            }
        }    
    }   
}

web.config

<system.serviceModel>  
    <services>          
        <service name="WcfService_SuiviColis.Service1" behaviorConfiguration="ServiceBehaviour">
            <endpoint 
                address="SaveData" 
                behaviorConfiguration="httpBehavior"
                binding="webHttpBinding" 
                contract="WcfService_SuiviColis.IService1"  />
        </service>
    </services>  
    <behaviors> 
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">       
          <serviceMetadata httpGetEnabled="true"/>          
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="httpBehavior">
                <webHttp/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
  </system.serviceModel>
  <system.webServer>
     <security>
         <requestFiltering>
             <verbs>
                 <add verb="POST" allowed="true"/>
             </verbs>
             <fileExtensions>
                 <add fileExtension=".svc" allowed="true"/>
             </fileExtensions>
         </requestFiltering>
     </security>

     <directoryBrowse enabled="true"/>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

我找不到端点的正确配置。

当我写这样的时候:

<endpoint 
    address="SaveData" behaviorConfiguration="httpBehavior" 
    binding="webHttpBinding" 
    contract="WcfService_SuiviColis.IService1" />

我找不到端点

当我这样写时:

<endpoint 
    address="" behaviorConfiguration="httpBehavior"
    binding="webHttpBinding" 
    contract="WcfService_SuiviColis.IService1"  />

我的方法不允许

当我写这样的时候:

<endpoint 
    address="" 
    binding="basicHttpBinding"   
    contract="WcfService_SuiviColis.IService1"  />

我收到错误415,输入不匹配因为我想收到JSON但是在fiddler中我得到了html

我也放了Factory="System.ServiceModel.Activation.WebServiceHostFactory"

当我把

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

我收到错误400页未找到

我这样称呼我的方法:

http://mydomain:4004/Code/WcfService_SuiviColis/WcfService_SuiviColis/Service1.svc/SaveData

EDITED 我认为正确的终点:

<endpoint 
    address="" behaviorConfiguration="httpBehavior"
    binding="webHttpBinding" 
    contract="WcfService_SuiviColis.IService1"  />

但是使用此端点我得到错误405,不允许mmethode。可以确定IIS 7不允许POST(从ANDROID接收数据到SERVER)? 因为我用GET创建了另一个wcf程序(将数据从SERVER发送到ANDROID),它运行正常。

2 个答案:

答案 0 :(得分:0)

乍一看,您定义的端点的地址无效。它应包含服务所在机器的完整地址以及端口号

<endpoint address ="http://mydomain:4004/...../>

答案 1 :(得分:0)

由于您使用的是IIS,因此使用的Web URL基本上由IIS定义:您的服务器名称,虚拟目录的名称,*.svc文件的路径和位置。

http://YourWebServer/VirtualDirectory/Path/service.svc

然后,您的端点定义中可能有一个额外的相对地址,因此如果您使用

<endpoint 
    address="SaveData" behaviorConfiguration="httpBehavior" 
    binding="webHttpBinding" 
    contract="WcfService_SuiviColis.IService1" />

然后完整的URL将是:

http://YourWebServer/VirtualDirectory/Path/service.svc/SaveData

我不确定您是否可能需要向该网址添加其他/SaveData,因为您已在服务合同中将其定义为UriTemplate

http://YourWebServer/VirtualDirectory/Path/service.svc/SaveData/SaveData
                                                       ++++++++ ********
                                                          |         |
                                             relative address       |
                                             from endpoint          |
                                                                    |
                                          UriTemplate from your service contract

未找到端点通常意味着您使用了错误的网址来尝试访问您的服务。