我必须创建一个没有IIS的WCF Soap应用程序,但我只是一个初学者。
我可以在浏览器中调用方法“ Addiere”,但我想通过WSDL查看方法列表。
Program.cs:
class Program
{
private static ServiceHost _wcfServiceHost = null;
static void Main(string[] args)
{
_wcfServiceHost = new ServiceHost(typeof(WcfTransferservice.Service1), new Uri("http://localhost:8000"));
_wcfServiceHost.AddServiceEndpoint(typeof(WcfTransferservice.IService1), new BasicHttpBinding(), "Soap");
ServiceEndpoint endpoint = _wcfServiceHost.AddServiceEndpoint(typeof(WcfTransferservice.IService1), new WebHttpBinding(), "Web");
endpoint.Behaviors.Add(new WebHttpBehavior());
try
{
_wcfServiceHost.Open();
Console.WriteLine("");
Console.WriteLine("This can also be accomplished by navigating to");
Console.WriteLine("http://localhost:8000/Web/EchoWithGet?s=Hello, world!");
Console.WriteLine("in a web browser while this sample is running.");
Console.WriteLine("");
Console.WriteLine("Press [Enter] to terminate");
Console.ReadLine();
_wcfServiceHost.Close();
}
catch (CommunicationException cex)
{
Console.WriteLine("An exception occurred: {0}", cex.Message);
_wcfServiceHost.Abort();
Console.ReadLine();
}
}
}
IService1.cs:
// HINWEIS: Mit dem Befehl "Umbenennen" im Menü "Umgestalten" können Sie den Schnittstellennamen "IService1" sowohl im Code als auch in der Konfigurationsdatei ändern.
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet]
int Addiere(int a, int b);
[OperationContract]
[WebGet]
int Multipliziere(int a, int b);
}
Web.config:
<?xml version="1.0" encoding="utf-8"?>
<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>
<!-- Legen Sie die Werte unten vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Metadateninformationen zu vermeiden. -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- Damit in Fehlern Ausnahmedetails zum Debuggen angezeigt werden, legen Sie den Wert unten auf "true" fest. Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Ausnahmeinformationen zu vermeiden. -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
Um das Stammverzeichnis der Webanwendung beim Debuggen auszuwählen, legen Sie den Wert unten auf "true" fest.
Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Informationen über den Webanwendungsordner zu vermeiden.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
我可以这样称呼“ addiere”方法:
http://localhost:8000/Web/addiere?a=4&b=8
但是如何调用WSDL来显示所有方法?
答案 0 :(得分:0)
我们需要将服务元数据行为添加到服务主机,请参考以下代码。
Uri uri = new Uri("http://localhost:9900");
WebHttpBinding binding = new WebHttpBinding();
ServiceHost sh=new ServiceHost(typeof(MyService),uri);
ServiceEndpoint se = sh.AddServiceEndpoint(typeof(IService), binding, "");
se.EndpointBehaviors.Add(new WebHttpBehavior());
ServiceMetadataBehavior smb;
smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb==null)
{
smb = new ServiceMetadataBehavior()
{
HttpGetEnabled = true
};
sh.Description.Behaviors.Add(smb);
}
//Add MEX service endpoint to make the call from the third party possible.
Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
sh.Open();
Console.WriteLine("service is ready");
Console.ReadLine();
sh.Close();
如果要通过添加服务引用来调用服务,则需要添加MEX端点。实际上,添加服务元数据行为后,WSDL可用。默认URL是
请随时告诉我是否有什么可以帮忙的。