gpt4 book ai didi

c# - 无法运行我的 wcf 服务

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:48 24 4
gpt4 key购买 nike

我已经创建了一个wcf服务,但是当我运行时,它会显示这样的错误。

enter image description here我已经使用重命名工具更改了名称类和接口(interface)名称。这是 service.cs 类的代码

public class MyTest : MyServices
{
public string MyTask1(string a)
{
return "Hello " + a;
}
public string MyTask2(DataContract1 dc)
{
return "Hello " + dc.fname;
}
}

这是我的界面代码:

[ServiceContract]
public interface MyServices
{

[OperationContract]
string MyTask1(string myValue);
[OperationContract]
string MyTask2(DataContract1 dcValue);

}

// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract]
public class DataContract1
{
string firstName;
string lastName;
[DataMember]
public string fname
{
get { return firstName; }
set { firstName = value; }
}
public string lname
{
get { return lastName; }
set { lastName = value; }
}
}

我已经编辑了我的 web.config 文件,并添加了这些行(我在黑皮书上读过)

<service name="Service" behaviorConfiguration="ServiceBehavior">
<!--Service EndPoints-->
<endpoint address="" binding="wsHttpBinding" contract="MyServices">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadatExchange"/>
</service>

这是我的 system.servicemodel 代码

<system.serviceModel>
<services>
<!-- My Custimization -->
<service name="Service" behaviorConfiguration="ServiceBehavior">
<!--Service EndPoints-->
<endpoint address="" binding="wsHttpBinding" contract="MyServices">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadatExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

最佳答案

1) 在遗留网络服务中,我们使用 wsdl 创建代理。 WSDL 公开 Web 服务元数据。在 wcf 中,另一个术语是 mex 端点,它也公开元数据,但 wsdl 仍然存在于 wcf 中。我是 wcf 的新手,因此我很困惑 wsdl 和 mex 端点之间的区别是什么?

这几乎是一回事,但 mex 旨在支持非 HTTP 协议(protocol)和高级配置/安全方案。 WSDL 是遗留方式,MEX 是 WCF 的新改进版本。

2) httpGetEnabled="false"或 httpGetEnabled="true"是什么意思

即使您没有为您的服务定义 mex 端点,它也会通过 wsdl 通过 defautl url 公开元数据。

3) 如果我设置 httpGetEnabled="false"那么会发生什么?这是否意味着客户端将无法从 IDE 添加服务引用?但我设置了 httpGetEnabled="false"并看到客户端可以添加服务引用。所以我很困惑 httpGetEnabled 是假还是真?

仅当启用 httpGetEnabled/httpsGetEnabled 或您在服务配置中定义了 mex 端点时,客户端才能在 VS 中添加引用。最佳实践是在开发环境而不是生产环境中公开元数据。您还可以通过单独的程序集分发您的服务契约(Contract)并使用 ChannelFactory。

4) 一个人说:- MEX 和 WSDL 是两种不同的方案,用于告诉潜在客户您的服务结构。因此,您可以选择将您的服务契约(Contract)公开为 (MEX) 或 WSDL。如果以上陈述为真,那么请告诉我何时使用 MEX 以及何时使用 WSDL?

WSDL 通常通过 http 或 https 获取您无法真正配置的 url 公开(比如出于安全限制或向后兼容性)。 MEX 端点通过可配置端点公开元数据,并且可以使用不同类型的传输,例如 TCP 或 HTTP,以及不同类型的安全机制。

因此 MEX 更易于配置,而 WSDL 与旧版本客户端和使用 WSDL 的非 .net 客户端的互操作性更高。

5) 我如何禁用 mex 并仅通过 WSDL 公开我的服务

不要在配置中指定 mex 端点并使用 httpGetEnabled

6) WSDL 支持所有的 bidning 像 wshttp,wsdualhttp 或 tcp 等...

公开元数据与调用服务完全不同。

更新

你的意思是配置中不应该有与 mex 端点相关的条目,httpgetenable 看起来像

是的,您不必指定 mex 端点和 httpGetEnabled。公开元数据只需要一个。不要指定 httpGetUrl,因为这取决于您的托管环境。

你说 mex 是可配置的,但 wsdl 不是。你想表达的意思是 mex 是可配置的...请讨论 mex 支持什么样的配置以及如何配置。

MEX 端点是特殊的端点,允许客户端使用 SOAP 消息而不是 http get 请求来接收服务的元数据。您可以创建可通过 http、https、tcp 甚至命名管道访问的 MEX 端点。 HttpGetEnable 允许您通过 HTTP GET 方法公开元数据,通常是服务的地址,后缀为 '?wsdl'

MEX 和 WSDL 都输出几乎相同的东西。

在大多数情况下,不需要 MEX 端点——使用带有 http get 的 WSDL 通常就足够了。

我明白你想了解这部分的意图,但不要在这上面花很多时间:还有很多其他复杂的功能!

关于c# - 无法运行我的 wcf 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22752491/

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