C# WCF服务405方法不允许异常
我正在VisualStudio2008中编写一个WCF服务,该服务将托管在Windows2008标准服务器上 我已经在IIS7中创建了一个新的网站,它有自己针对ASP.NET 2.0的应用程序。我向服务器角色添加了.NET3.0Framework功能。我已经完成了涉及*.svc扩展和aspnet_isapi模块的所有步骤。我已经运行了“ServiceModelReg-r”并重新启动了IIS以及服务器本身 我的项目针对.NETFramework 3.5进行构建。我的解决方案将项目引用为使用服务器Web目录的UNC路径的网站。该项目构建时没有错误,我可以在我的客户端项目(在我的Win XP开发虚拟机上)中成功地向我的WCF服务添加服务引用。我的客户端项目生成并运行,但在服务方法(CheckDatabaseConnection)调用期间引发异常。My web.config和服务类附在下面,后面是客户端应用程序。我完全没有主意了 web.config:C# WCF服务405方法不允许异常,c#,web-services,iis-7,wcf,C#,Web Services,Iis 7,Wcf,我正在VisualStudio2008中编写一个WCF服务,该服务将托管在Windows2008标准服务器上 我已经在IIS7中创建了一个新的网站,它有自己针对ASP.NET 2.0的应用程序。我向服务器角色添加了.NET3.0Framework功能。我已经完成了涉及*.svc扩展和aspnet_isapi模块的所有步骤。我已经运行了“ServiceModelReg-r”并重新启动了IIS以及服务器本身 我的项目针对.NETFramework 3.5进行构建。我的解决方案将项目引用为使用服务器W
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" />
<services>
<service behaviorConfiguration="ConnectivityBehavior" name="EDCO.Web.Services.Connectivity">
<endpoint address="http://validurl.net" binding="wsHttpBinding" contract="EDCO.Web.Services.IConnectivity">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ConnectivityBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
[ServiceContract(Namespace="http://validurl.net")]
public interface IConnectivity
{
#region Methods
[WebGet()]
[WebInvoke(Method="GET")]
[OperationContract()]
bool CheckDatabaseConnection(string server, string database, string user, string password);
#endregion Methods
} // interface IConnectivity
public class Connectivity : IConnectivity
{
#region Members
const string CONN_STRING = "Server={0};Database={1};User ID={2};Password={3};";
#endregion Members
#region Methods
public bool CheckDatabaseConnection(string server, string database, string user, string password)
{
SqlConnection conn = null;
try
{
conn = new SqlConnection(string.Format(CONN_STRING, server, database, user, password));
conn.Open();
}
catch
{
return false;
}
finally
{
if (conn != null)
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
conn.Dispose();
}
}
return true;
} // CheckDatabaseConnection(server, database, user, password)
#endregion Methods
} // class Connectivity
class Program
{
#region Methods
static void Main(string[] args)
{
Connectivity.ConnectivityClient connect = new Connectivity.ConnectivityClient();
Console.WriteLine("Establishing connection...");
if (connect.CheckDatabaseConnection("dbServer", "dbName", "login", "password"))
{
Console.WriteLine("Successful connection!");
}
else
{
Console.WriteLine("Connection failed.");
}
Console.ReadLine();
} // Main()
#endregion Methods
} // class Program
Connectivity.svc.cs:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" />
<services>
<service behaviorConfiguration="ConnectivityBehavior" name="EDCO.Web.Services.Connectivity">
<endpoint address="http://validurl.net" binding="wsHttpBinding" contract="EDCO.Web.Services.IConnectivity">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ConnectivityBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
[ServiceContract(Namespace="http://validurl.net")]
public interface IConnectivity
{
#region Methods
[WebGet()]
[WebInvoke(Method="GET")]
[OperationContract()]
bool CheckDatabaseConnection(string server, string database, string user, string password);
#endregion Methods
} // interface IConnectivity
public class Connectivity : IConnectivity
{
#region Members
const string CONN_STRING = "Server={0};Database={1};User ID={2};Password={3};";
#endregion Members
#region Methods
public bool CheckDatabaseConnection(string server, string database, string user, string password)
{
SqlConnection conn = null;
try
{
conn = new SqlConnection(string.Format(CONN_STRING, server, database, user, password));
conn.Open();
}
catch
{
return false;
}
finally
{
if (conn != null)
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
conn.Dispose();
}
}
return true;
} // CheckDatabaseConnection(server, database, user, password)
#endregion Methods
} // class Connectivity
class Program
{
#region Methods
static void Main(string[] args)
{
Connectivity.ConnectivityClient connect = new Connectivity.ConnectivityClient();
Console.WriteLine("Establishing connection...");
if (connect.CheckDatabaseConnection("dbServer", "dbName", "login", "password"))
{
Console.WriteLine("Successful connection!");
}
else
{
Console.WriteLine("Connection failed.");
}
Console.ReadLine();
} // Main()
#endregion Methods
} // class Program
客户端程序。cs:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" />
<services>
<service behaviorConfiguration="ConnectivityBehavior" name="EDCO.Web.Services.Connectivity">
<endpoint address="http://validurl.net" binding="wsHttpBinding" contract="EDCO.Web.Services.IConnectivity">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ConnectivityBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
[ServiceContract(Namespace="http://validurl.net")]
public interface IConnectivity
{
#region Methods
[WebGet()]
[WebInvoke(Method="GET")]
[OperationContract()]
bool CheckDatabaseConnection(string server, string database, string user, string password);
#endregion Methods
} // interface IConnectivity
public class Connectivity : IConnectivity
{
#region Members
const string CONN_STRING = "Server={0};Database={1};User ID={2};Password={3};";
#endregion Members
#region Methods
public bool CheckDatabaseConnection(string server, string database, string user, string password)
{
SqlConnection conn = null;
try
{
conn = new SqlConnection(string.Format(CONN_STRING, server, database, user, password));
conn.Open();
}
catch
{
return false;
}
finally
{
if (conn != null)
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
conn.Dispose();
}
}
return true;
} // CheckDatabaseConnection(server, database, user, password)
#endregion Methods
} // class Connectivity
class Program
{
#region Methods
static void Main(string[] args)
{
Connectivity.ConnectivityClient connect = new Connectivity.ConnectivityClient();
Console.WriteLine("Establishing connection...");
if (connect.CheckDatabaseConnection("dbServer", "dbName", "login", "password"))
{
Console.WriteLine("Successful connection!");
}
else
{
Console.WriteLine("Connection failed.");
}
Console.ReadLine();
} // Main()
#endregion Methods
} // class Program
好的,看起来我通过在web.config中添加一个identity元素解决了这个问题。奇怪的是,这并不是网上流传的答案之一,但我在看一篇几乎无关的文章时偶然发现了它。修复方法如下所示:
<service behaviorConfiguration="ConnectivityBehavior" name="EDCO.Web.Services.Connectivity">
<endpoint address="http://validurl.net/Connectivity.svc" binding="wsHttpBinding" contract="EDCO.Web.Services.IConnectivity">
<identity>
<dns value="validurl.net" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
好的,看起来我通过在web.config中添加一个identity元素解决了这个问题。奇怪的是,这并不是网上流传的答案之一,但我在看一篇几乎无关的文章时偶然发现了它。修复方法如下所示:
<service behaviorConfiguration="ConnectivityBehavior" name="EDCO.Web.Services.Connectivity">
<endpoint address="http://validurl.net/Connectivity.svc" binding="wsHttpBinding" contract="EDCO.Web.Services.IConnectivity">
<identity>
<dns value="validurl.net" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>