wsdl not showing XML-WCF - wcf

When calling service url https://example.com/TestService.svc I am getting the below 2 URLs but when I am trying to click on WSDL then it is not working.
WSDL URLs
http://example.com/TestService.svc?wsdl -- NOT WORKING
http://example.com/TestService.svc?singleWsdl -- NOT WORKING
Manually change http to https
https://example.com/TestService.svc?wsdl -- WORKING
https://example.com/TestService.svc?singleWsdl -- WORKING
Client Config
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</client>
<behaviors>
<serviceBehaviors>
<clear/>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true" minFreeMemoryPercentageToActivateService="0" />
Main Service Config
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<clear />
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true" minFreeMemoryPercentageToActivateService="0">
<serviceActivations>
<clear />
<add factory="DataServicesHost.UnityServiceHostFactory" relativeAddress="TestService.svc" service="TestService.Service" />
</serviceActivations>
</serviceHostingEnvironment>
Service Consuming
var customHeader = new MessageHeader<Security>(security);
var tempHeader = customHeader.GetUntypedHeader("Security", "http://tempuri.org/");
var client = new ServiceClient();
using (var scope = new OperationContextScope(client.InnerChannel))
{
OperationContext.Current.OutgoingMessageHeaders.Add(tempHeader);
objDataRequest = client.DataRequest("test");
}

From the above configuration, we can infer that it belongs to the client-side. However, the WSDL feature of the WCF service is set up on the server-side. It is controlled by the ServiceMetadata section.
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
Therefore, if we want to have the HTTP protocol of WSDL feature working, we need to enable it on the server-side and apply the service behavior in the service section(the endpoint should be within the service section instead of client section).
<system.serviceModel>
<services>
<service name="WcfService3.Service1" behaviorConfiguration="sb">
<endpoint address="" binding="basicHttpBinding" contract="WcfService3.IService1"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="sb">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
Feel free to let me know if there is anything I can help with.

Related

WCF- 1 service, multiple endpoints and multiple behaviours?

I have 1 service and multiple endpoints as shown below. I want to have a general behaviour and overwrite my wshttpbinding with another behaviour but when I try that I receive error tells me
Parser Error Message: There is no endpoint behavior named 'CredentialValidator'.
what am I doing wrong?
<services>
<service name="myservice.Service.myserviceService" behaviorConfiguration="myserviceBehaviour">
<host>
<baseAddresses>
<add baseAddress="https://localhost:44300/myService.svc"/>
<!--<add baseAddress="http://localhost:54941/myService.svc"/>-->
<!--<add baseAddress="http://myservicewcf.myurl-staging.com/myService.svc"/>-->
<add baseAddress="https://myservice.myurl-staging.com/myService.svc"/>
<add baseAddress="https://myservice.production.com/myService.svc"/>
<!--<add baseAddress="https://myservicetest.myurl-staging.com/myService.svc"/>-->
</baseAddresses>
</host>
<endpoint name="myserviceSoap12Endpoint" address="soap12" binding="customBinding" bindingConfiguration="soap12selfBinding" contract="myservice.Service.ImyserviceService" behaviorConfiguration="CredentialValidator" />
<endpoint name="myserviceWSHttpEndpoint" address="ws" binding="wsHttpBinding" bindingConfiguration="myserviceWSHttpBinding" contract="myservice.Service.ImyserviceService"/>
<endpoint name="myserviceBasicHttpEndpoint" address="" binding="basicHttpBinding" bindingConfiguration="myserviceBasicHttpBinding" contract="myservice.Service.ImyserviceService"/>
<!--<endpoint name="myserviceBasicHttpEndpoint2" address="" binding="basicHttpBinding" bindingConfiguration="myserviceBasicHttpBinding" contract="myservice.Service.ImyserviceService2"/>-->
<endpoint name="myserviceMexEndpointHttps" address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name ="CredentialValidator">
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug
includeExceptionDetailInFaults="true"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="myservice.Service.CustomUserNameValidator, myservice"/>
</serviceCredentials>
</behavior>
<behavior name="myserviceBehaviour">
<useRequestHeadersForMetadataAddress/>
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
Try putting your CredentialValidatorbehavior in <endpointBehaviors> tags instead of <serviceBehaviors>.
Because the exception message clearly states that there is not any endpointBehavior with that name. So give it one! Like this:
<behaviors>
**<endpointBehaviors>**
<behavior name ="CredentialValidator">
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
**</endpointBehaviors>**
<serviceBehaviors>
<behavior name="myserviceBehaviour">
<useRequestHeadersForMetadataAddress/>
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>

netnamedpipebinding Failed to add a service. Service metadata may not be accessible

<services>
<service name="WcfServiceApplication.WallService" behaviorConfiguration="mex" >
<host>
<baseAddresses>
<add baseAddress="net.pipe://localhost:10042/"/>
</baseAddresses>
</host>
<endpoint address="WallService.svc"
binding="netNamedPipeBinding" bindingConfiguration="basic" name="Basic"
contract="WcfServiceApplication.IWallService"></endpoint>
<endpoint address="mex"
binding="mexNamedPipeBinding"
contract="IMetadataExchange"></endpoint>
</service>
</services>
<bindings>
<netNamedPipeBinding>
<binding name="basic"></binding>
</netNamedPipeBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata httpGetEnabled="true" />
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
I have found the solution by troubleshooting and have resolved it.
Service should be hosted in a process and then be called.

Can't get Metadata Publishing for my WCF webHttpBinding Service

I keep getting the page when I browse to my svc file that metadata publishing is not turned on but I have done everything for it. Here's my web.config. What am I doing wrong?
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="AlphaFrontEndSiteASP.TestsServiceAspNetAjaxBehavior">
<enableWebScript />
</behavior>
<behavior name="AlphaFrontEndSiteASP.Services.TestsService">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="MetadataBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="AlphaFrontEndSiteASP.Services.TestsService" behaviorConfiguration="MetadataBehavior">
<endpoint address="" behaviorConfiguration="AlphaFrontEndSiteASP.TestsServiceAspNetAjaxBehavior" binding="webHttpBinding" contract="AlphaFrontEndSiteASP.Services.TestsService" />
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
</service>
</services>
</system.serviceModel>

Configuring wcf rest services in web.config

Where in the web.config should the following blocks of code go for a WCF RESTful service?
<endpoint address="" binding="webHttpBinding"contract="Wcf_Test.IMyService"
behaviorConfiguration="httpEndpointBehavour">
<identity>
<dns value="localhost"/>
<Identity>
</endpoint>
and
<behaviors>
<serviceBehaviors>
<behavior name="httpBehaviour"> <serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
and
<endpointBehaviors>
<behavior name="httpEndpointBehavour">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
In order to configure a WCF REST service, you need a few things in your web.config file
1) Declare your service and its endpoint
<services>
<service name="SparqlService.SparqlService" behaviorConfiguration="ServiceBehavior">
<endpoint binding="webHttpBinding" contract="SparqlService.ISparqlService"
behaviorConfiguration="webHttp"/>
</service>
</services>
Service name will be [project name].[service name]
Behavior configuration will be same name as the behavior you declare in the next step
Binding must be webHttpBinding because you want it as REST. If you want SOAP, you declare as basicHttpBinding
Contract is the [project name].[interface name]
Behavior configuration in the endpoint will be the name you declare in next step
2) Declare the service behavior (usually default)
<behavior name="ServiceBehavior" >
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
Behavior name can be anything, but it will be used to match BehaviorConfiguration you declared in step 1
Leave the rest alone
3) Declare your endpoint behavior
<endpointBehaviors>
<behavior name="webHttp">
<webHttp/>
</behavior>
</endpointBehaviors>
Behavior name can be anything, but it will be used to match the behaviorConfiguration in endpoint.
In the end, this is what the web.config should look like for a simple REST service:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="SparqlService.SparqlService" behaviorConfiguration="ServiceBehavior">
<endpoint binding="webHttpBinding" contract="SparqlService.ISparqlService"
behaviorConfiguration="webHttp"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior" >
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="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>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
for the rest type using WCFservice
<configuration>
<system.serviceModel>
<services>
<service>
<--
"place the first code snippet here "
it will contain the endpoint details
for WCFrestfulServices it will have 'A' ,'B' and 'C'
that is address, binding and contract
-->
</service>
</services>
<behaviors>
<servicebehaviours>
<--
"place the second code snippet"
the name of the behavior should be the same to that of the
behavior configuration attribute value of service tag
-->
</servicebehaviours>
<endpointBehaviors>
<--
"place your third code snippet"
the name of the behavior should be the same to that of the
behavior configuration attribute value of endpoint tag
-->
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Web config changes.
<system.serviceModel>
<services>
<service name="WcfService1.Service1">
<endpoint address="" behaviorConfiguration="restbehavior" binding="webHttpBinding" bindingConfiguration=""
contract ="WcfService1.IBookService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost/bookservice"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="restbehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Interface: we have to use WebGet for httpGet / WebInvoke for HttpPost & Put & Delete.
[ServiceContract]
public interface IBookService
{
[OperationContract]
[WebGet]
List<BOOK> GetBooksList();
[OperationContract]
[WebGet(UriTemplate = "Book/{id}")]
BOOK GetBookById(string id);
[OperationContract]
[WebInvoke(UriTemplate = "AddBook/{name}")]
void AddBook(string name);
}
Ref : https://www.codeproject.com/Articles/571813/A-Beginners-Tutorial-on-Creating-WCF-REST-Services

WCF HttpsGetUrl A registration already exists for URI

This is similar to other Stack postings, but slightly different in that I am only hosting a single wsHttp endpoint (and the mex). When I leave the httpsGetUrl empty, it shows the server name instead of the public uri that I need (for the wsdl)
Here is the important part of the config.
<service behaviorConfiguration="myServiceBehaviors" name="WebApplication1.Service1">
<clear/>
<endpoint behaviorConfiguration="flatwsdl" address="mex" binding="mexHttpsBinding" bindingConfiguration="mexHttpsBinding"
contract="IMetadataExchange" listenUriMode="Explicit">
</endpoint>
<endpoint behaviorConfiguration="flatwsdl" address="wsHttp" binding="wsHttpBinding" bindingConfiguration="wsHttpBindingConfig"
contract="WebApplication1.IService1" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="myServiceBehaviors">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpsGetEnabled="true" httpsGetUrl="https://mydomain.com/integration/Service1.svc" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="flatwsdl">
<wsdlExtensions />
</behavior>
</endpointBehaviors>
</behaviors>
any suggestions?
If you want the public URI, you should use the <useRequestHeadersForMetadataAddress> behavior in your service behavior, that's exactly what this behavior is for.
<behavior name="myServiceBehaviors">
<useRequestHeadersForMetadataAddress />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpsGetEnabled="true" />
</behavior>