gpt4 book ai didi

c# - 带有 ChannelFactory 的 WCF 客户端,方法返回 ProtocolException/405 Method not Allowed

转载 作者:行者123 更新时间:2023-11-30 18:26:43 27 4
gpt4 key购买 nike

我正在编写程序的一部分,用于客户端和服务器之间的通信。

服务仅将查询转发到数据库。但是,当我尝试发送查询时,出现异常“ProtocolException/(405) Method not allowed”。

我尝试了来自 ProtocolException Unhandled/(405) Method not allowed with WCF; Bindings and Endpoints look right though 的答案, 但没有任何帮助。

这是我的一些文件:

通信客户端它是一个库,因为我们想在 Unity 中使用它,我也想在测试中使用这个代码。

namespace Client
{
public class ClientCommunicationWcf : IDisposable
{
private readonly ChannelFactory<ITask> _taskFactory;


public ClientCommunicationWcf()
{
_taskFactory = new ChannelFactory<ITask>("localhost");
}

public T GetResponse<T>(string commandName, object data)
{
var channel = _taskFactory.CreateChannel();
channel.Execute(commandName, data);
return (T)channel.ResponseObject;
}

public void Dispose()
{
_taskFactory.Close();
((IDisposable) _taskFactory).Dispose();
}
}
}

数据合约

namespace CommunicationCommonLib.Requests
{
[DataContract]
[KnownType(typeof(LoginUserRequest))]
public class LoginUserRequest
{
[DataMember]
private readonly string _username;
[DataMember]
private readonly string _password;


public LoginUserRequest(string username, string password)
{
_username = username;
_password = password;
}


public string Username
{
get { return _username; }
}

public string Password
{
get { return _password; }
}
}
}

服务合约

namespace CommunicationCommonLib
{
[ServiceContract]
public interface ITask
{
object ResponseObject
{
[OperationContract]
get;
}

/// <param name="data"></param>
[OperationContract]
void Execute(string commandName, object data);
}
}

服务:IServerTask 是 ITask 的 child

namespace WcfService2
{
public class ServerTaskService : IServerTask, ITask
{
private object _responseObject;


public object ResponseObject
{
get { return _responseObject; }
}


public void Execute(string commandName, object data)
{
DataCommands.RunCommand(commandName, data, this);
}

public void SetResponse(object response)
{
_responseObject = response;
}
}
}

Web.config

<?xml version="1.0"?>
<configuration>

<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>

<behaviors>
<serviceBehaviors>
<behavior name="WcfService2.ServerTaskServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>

<services>
<service behaviorConfiguration="WcfService2.ServerTaskServiceBehavior" name="WcfService2.ServerTaskService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" contract="CommunicationCommonLib.ITask" />
</service>
</services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />


<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="01:00:00" sendTimeout="04:00:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="209715200" maxBufferSize="52428800" maxReceivedMessageSize="52428800"
textEncoding="utf-8" transferMode="Streamed" useDefaultWebProxy="false"
messageEncoding="Mtom">
<readerQuotas maxStringContentLength="10485760" maxArrayLength="52428800" />
<security mode="None">
<transport clientCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
</bindings>

</system.serviceModel>

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

</configuration>

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<client>
<endpoint address="http://localhost:55555/Task" binding="basicHttpBinding" contract="CommunicationCommonLib.ITask" name="localhost"/>
</client>
</system.serviceModel>
</configuration>

地址“http://localhost:5555/Task”也在 WcfService2 - 属性 - Web 中设置,其中使用了 IIS Express。我编写了用于测试客户端服务器通信的 WPF 应用程序,其中存储了 App.config。 WPF仅用于发送请求和检查结果。

Web.config 可能是错误的,因为它是我的第一个 WCF,我尝试了与示例不同的东西。

当我运行程序时,浏览器打开“http://localhost:5555/Task”,所以我认为该服务正在运行。

感谢您的帮助。

编辑: ServerTaskService 是 IServerTask 和 ITask 的子项。

最佳答案

您的服务契约名称是 ITask,而您的服务类实现了一些不同的接口(interface),即 IServerTask。请更正服务类定义。

关于c# - 带有 ChannelFactory 的 WCF 客户端,方法返回 ProtocolException/405 Method not Allowed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28123769/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com