Deploy WCF service, C#, WCF, VS2008 - c#

I have a test project, WCF Service Library, and I published the project. Have a 2003 server with all the right installation. I browse to my application and upon clicking on .svc I get this error.
The type 'SearchService', provided as the Service attribute value in the ServiceHost directive could not be found.
This is the snippet from my web.config
<endpoint address="" binding="wsHttpBinding" contract="TestService.ISearchService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
My Interface:
[ServiceContract]
public interface ISearchService
{
[OperationContract]
string GetName();
}
My Implementation:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class SearchService :ISearchService
{
#region ISearchService Members
public string GetName()
{
returnn "HAL-2001"
}
}

Well, the wsHttpBinding requires you to connect to your service using SOAP - a web browser alone won't cut it, so that's why it's not working when you browse to the .svc file. Nothing wrong there, really.
You need to create a real full-fledged SOAP client to connect to your service and test it. Alternatively, you could also use the WcfTestClient.exe test client which sits in your VS2008\Common7\IDE folder.
Marc

ANo, the error indicates the host could not find the definition for service implementation "SearchService" in your web.config. In you web.config, you need to wrap the <endpoint> tag in a <service> tag. The name attribute of the <service> should be set to the full name of you SearchService class ( including all namespaces). You also need to define a behavior to enable the service to show WSDL in a browser. You may also want to remove the <dns value="localhost" /> when you deploy the service to a server.
Here is an example snippet, make sure your put the full class name of SearchService in <service> tag, and also make sure the full class name is in your .svc file:
<system.serviceModel>
<services>
<service name="SearchService" behaviorConfiguration="ServiceBehavior">
<endpoint address="" binding="wsHttpBinding" contract="TestService.ISearchService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<!-- 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>
</behaviors> </system.serviceModel>

ANo, you should switch over to the basicHttpBinding and test to make sure everything is working. You're using the WSHttpBinding and by default it has authentication turned on. You're client will need to pass credentials for it to actually get a response, that's why the browser call isn't working.

What is your client code calling? For this to work it should be calling a proxy class like the following.
class SearchServiceProxy : ClientBase<ISearchService>, ISearchService
{
public string GetName()
{
return Channel.GetName();
}
}

Related

WCF endpoints on production server

I have made a simple WCF service, and it´s working like a charm in my developer environment. But now I'm moving it to my test server (AZURE) and i can´t get the endpoint address correct. The IIS is up and running, and the service is working locally on the test server.
When I try to test the service in WCF Test client, I receive an error when I try to invoke that the endpoint is incorrect:
There was no endpoint listening at mypathattestserver/Service1.svc
that could accept the message. This is often caused by an incorrect
address or SOAP action. See InnerException, if present, for more
details.
This is my web.config:
<services>
<service behaviorConfiguration="Test.Service1Behavior" name="Test.tfn">
<endpoint address="" binding="basicHttpBinding" contract="Test.IService1">
<identity>
<dns value="http://mypathattestserver.cloudapp.net/service1.svc"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Test.Service1Behavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
I would suggest the following steps:
Check the service with another client. SoapUI is a very good web service client. If the service responds to SoapUI then the problem is on your client
If the server is fine and the problem is at your client, remove the reference looking at the specific server and add it again.
Finally, check your firewalls. If the system plays fine by having the client and the server on the same machine, the firewalls could be a problem when the server is located on another machine.
Hope I helped!

How to add service reference for a netTcpBinding service?

Simple problem :
How to self host a netTcpBinding service in client project right clicking Service References > Add Service Reference ...
Clicking "Discover" it references all services using WsHttpBinding including the netTcpBinding one. But when expanding the netTcpBinding one it can't navigate to the contract and it throw the following error :
Could not find a base address that matches scheme net.tcp for the
endpoint with binding MetadataExchangeTcpBinding. Registered base
address schemes are [http].
I found the following .Net WCF sample very nice and neat, but in the example, it doesn't show how the config file is set, and how we could get the proxy via the wizzard.
C:\WF_WCF_Samples\WCF\Basic\Binding\Net\Tcp\Default\CS
Here is the service config file ... (I don't use any base adress, it should work without it I think)
<service behaviorConfiguration="Canopus.WebServices.LogAndNotificationService"
name="Canopus.WebServices.LogAndNotificationService">
<endpoint address="" binding="netTcpBinding"
contract="Canopus.WebServices.ILogAndNotificationService" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
<behaviors>
<serviceBehaviors>
<behavior name="Canopus.WebServices.LogAndNotificationService">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
Thanks for your help !
I think your service behaviour cannot have httpGetEnabled attribute when u r dealing with netTcPBinding. and also looks like ur end point address contains something like http:// it should be net.tcp://.

exposing net.tcp endpoint

I'm a bit confused of how to expose an endpoint in WCF
I've got a tcp endpoint and a mex tcp endpoint.
<service name="MessageReaderService.MessageReaderService">
<endpoint name="NetTcpReaderService"
address="ReaderService"
binding="netTcpBinding" bindingConfiguration=""
contract="Contracts.IMessageReaderService" />
<endpoint name="netTcpMex"
address="mex"
binding="mexTcpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8082" />
</baseAddresses>
</host>
</service>
When I try to run this in the service host I get the following exception :
The contract name 'IMetadataExchange' could not be found in the list of contracts
implemented by the service MessageReaderService. Add a ServiceMetadataBehavior to the
configuration file or to the ServiceHost directly to enable support for this contract.
So I conclude from this error that I need to add a service behavior to expose metadata.
So I added the behavior :
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
but then I get a different error :
The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the
HttpGetUrl property is a relative address, but there is no http base address. Either
supply an http base address or set HttpGetUrl to an absolute address.
So now I have to actually add another endpoint (http) to expose the metadata over mexhttpbinding ?
is there a simple way to expose the endpoint over tcp ?
Two things:
(1) once you've defined the service behavior, you of course must also apply it to the service!
<service name="MessageReaderService.MessageReaderService"
behaviorConfiguration="ServiceBehavior">
(2) you don't need an HTTP endpoint - you don't need to have an HTTP URL - just define this service behavior like this:
<behavior name="ServiceBehavior">
<serviceMetadata />
</behavior>
Your metadata is now available over a mexTcpBinding endpoint - you cannot browse to it using HTTP, but a client can definitely connect to it and use it!
You can verify this by using the WCF Test Client and going to either
net.tcp://localhost:8082 (the base address)
or
net.tcp://localhost:8082/mex (the mex address)
in both cases, the WCF Test Client should now find your service and be able to discover its capabilities.

How to host Wcf service in IIS problem?

i have read more articles but i can nto host wcf service in IIS
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- When deploying the service library project, the content of the config file must be added to the host's
app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<services>
<service name="WcfSrv.MyProject.GetTables.ServiceCrm">
<endpoint address="" binding="wsHttpBinding" contract="WcfSrv.MyTechnic.GetTables.IService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/WcfSrv.MyProject.GetTables/ServiceTest/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<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>
</behaviors>
</system.serviceModel>
</configuration>
MyCodes:These code wcf service codes
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Data.Objects;
namespace WcfSrv.MyProject.GetTables
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together.
public class ServiceTest : IService
{
public List GetAllData(string CustomerName)
{
using (CrmEntities crmCtx = new CrmEntities())
{
return crmCtx.GetAllDataCustomer(CustomerName).ToList();
}
}
}
}
i try to host my Wcf service 192.168.0.218 i added Srv file and dll new virtual directory but i can not use wcf service.How to make it? i changed config file Best Regards...
Have you (re)installed basic asp integration on IIS using aspnet_regiis -i
(C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -i)
Since you don't specify the exact error it is hard to help, but the svc files need to be bound in IIS which rerunning the above statement usually resolves that problem.
WCF services hosted in IIS are represented as special content files (.svc files) inside the IIS application. See Hosting WCF Services in IIS section here how to use it and how to host you WCF service.

I've created a WCF service and now I want to call it from a reference but why InvalidOperationException?

I've written a WCF service. I have successfully browsed to the service and it says:
You have created a service.
So then I add a reference to it using a the 'Add Service Reference' in visual studio. Then I write the following code to consume it....
ServiceReference1.VLSContentServiceClient client = new ServiceReference1.VLSContentServiceClient("VLSContentServiceEndpointBehaviour");
List<ServiceReference1.Category> cats = client.GetCategoriesByGET();
But im getting the error:
Could not find endpoint element with
name
'VLSContentServiceEndpointBehaviour'
and contract
'ServiceReference1.IVLSContentService'
in the ServiceModel client
configuration section. This might be
because no configuration file was
found for your application, or because
no endpoint element matching this name
could be found in the client element.
It makes no sense because the argument 'endPointConfigurationName' matches what I have set it to in the service. Here is the service configuration:
<system.serviceModel>
<services>
<service behaviorConfiguration="VLSContentServiceBehaviour" name="VLSContentService">
<endpoint address="" behaviorConfiguration="VLSContentServiceEndpointBehaviour" binding="webHttpBinding" contract="IVLSContentService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="VLSContentServiceBehaviour">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="VLSContentServiceEndpointBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Whats going on?
You are using REST service - client for such service cannot be created with Add service reference. That is only for SOAP services (no webHttpBinding and webHttp behavior). Also once you use SOAP service you don't pass name of any server side feature to the constructor of the proxy. The proxy constructor expects name of client endpoint from client's configuration.
How to consume REST service
Looks like your contract is not correct. you have:
contract="IVLSContentService"/>
and it is expecting:
contract="ServiceReference1.IVLSContentService"/>
according to the error message.
also your endpoint address is empty. Does that not need to contain something?
The VLSContentServiceEndpointBehaviour parameter while creating an instance of client is the Name of the endpoint and not the endpoing behaviour.
Change
<endpoint address="" behaviorConfiguration="VLSContentServiceEndpointBehaviour" binding="webHttpBinding" contract="IVLSContentService"/>
to
<endpoint address="" name ="Client" behaviorConfiguration="VLSContentServiceEndpointBehaviour" binding="webHttpBinding" contract="IVLSContentService"/>
and create a service client as
ServiceReference1.VLSContentServiceClient client = new ServiceReference1.VLSContentServiceClient("Client");
Also your address is missing which is bit strange.

Categories

Resources