WP 8 WCF Error when run on device - c#

I have an WP 8 app that consumes a WCF service hosted in my IIS 8. If I run the app from VS2013 and choose the device or emulator, the apps works fine. If I deploy the app and run the app direct from the device, the apps show the error:
Object reference not set to an instance of an object.Stack. tRACE: System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(MessageReply, MessageFault fault, String action, MessageVersion version)...
Here is my app.config of my WCF service:
<services>
<service behaviorConfiguration="Metadata" name="WCFDataLibrary.EnvioDados">
<clear />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"
listenUriMode="Explicit">
<identity>
<dns value="http://192.168.1.5" />
<certificateReference storeName="My" storeLocation="LocalMachine"
x509FindType="FindBySubjectDistinguishedName" />
</identity>
</endpoint>
<endpoint
address="http://192.168.1.5/wcfdatasite/EnvioDados.svc"
binding="basicHttpBinding"
contract="WCFDataLibrary.IEnvioDados"/>
<host>
<baseAddresses>
<!--<add baseAddress="http://localhost:8080/WCFDataService" />-->
<add baseAddress="http://192.168.1.5/WCFDataService/EnvioDados" />
</baseAddresses>
</host>
</service>
</services>
Like I said, everything works well when I run the app on the device from my VS2013, but it's not working when I deploy the app to the same device and run the app just using the device's wireless.

The problem was in the serviceMetadata configuration.
The original key was:
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://192.168.1.5/WCFDataService/meta"/>
and the correct value needs to be:
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://192.168.1.5/WCFDataService/meta?wsdl" />
Now it's working perfectly!

Related

WCF error - Can't get service endpoint up

I started working with WCF recently, and I'm having a problem that I just don't have a clue how to solve.
I start a WCF Service using Service Host, but when I use the URI in a browser it doesn't show the contract of the service, and it gives an exception when I try to connect to it using a ChannelFactory.
I created the project in Visual Studio 2017, and didn't do anything to the config file, excpet changing the base address. Both the service interface and implementation are in the root project "folder", and I've tried disabling the firewall and even my antivirus, but nothing seems to work.
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="TaskExecutor.Exec">
<endpoint address="" binding="basicHttpBinding" contract="TaskExecutor.IExec">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8001/TaskExecutor/Exec/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
Service interface:
namespace TaskExecutor
{
[ServiceContract]
public interface IExec
{
[OperationContract]
void DoWork();
}
}
Service implementation:
namespace TaskExecutor
{
public class Exec : IExec
{
public void DoWork()
{
Console.WriteLine("Doing work.");
}
}
}
Program launching the service:
using (ServiceHost host = new ServiceHost(typeof(Exec)))
{
host.Open();
Console.WriteLine("exec service started at {0}", host.BaseAddresses[0]);
}
Console.WriteLine("Press any key to end...");
Console.ReadLine();
After launching the program display the message:
exec service started at http://localhost:8001/TaskExecutor/Exec/
Press any key to end...
The service client code is the following:
EndpointAddress endpoint = new EndpointAddress("http://localhost:8001/TaskExecutor/Exec/");
BasicHttpBinding binding = new BasicHttpBinding();
ChannelFactory<IExec> channelFactory = new ChannelFactory<IExec>(binding, endpoint);
IExec proxy = channelFactory.CreateChannel();
proxy.DoWork();
And it gives the exception:
System.ServiceModel.EndpointNotFoundException occurred
HResult=0x80131501
Message=There was no endpoint listening at http://localhost:8001/TaskExecutor/Exec/ that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.
Inner Exception 1:
WebException: Unable to connect to the remote server
Inner Exception 2:
SocketException: No connection could be made because the target machine actively refused it
I seriously don't know what to do, and any help would be amazing.
Thank you very much!
You have exposed metadata but didnt bind it to the service.Here's how you have to.
<behaviors>
<serviceBehaviors>
<behavior name="metadadiscovery">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
Now bind the behavior to the service.
<services>
<service name="TaskExecutor.Exec" behaviorConfiguration="metadadiscovery">
<endpoint address="" binding="basicHttpBinding" contract="TaskExecutor.IExec">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8001/TaskExecutor/Exec/" />
</baseAddresses>
</host>
</service>
</services>
Now when you type the address in the browser you should be able to see wsdl.
http://localhost:8001/TaskExecutor/Exec/
So I figured out what was wrong, It was the code starting the service. instead of what I have It should be:
using (ServiceHost host = new ServiceHost(typeof(Exec)))
{
host.Open();
Console.WriteLine("exec service started at {0}", host.BaseAddresses[0]);
Console.WriteLine("Press any key to end...");
Console.ReadLine();
}

Construct Solution with Multiple WCF Applications

We currently have a solution with only one WCF application, during the next two years the solution grows a lot.
It's around 70 different services.
We are using Windows Identity Foundation for security for majority, others use SSL and some don't have
I'm looking to restructure the application, I'am thinking about having multiple WCF application (one for business services, and other for backend services, etc...),
I think it can help for a lot for testing.
My question is:
Is there a way to construct a solution with multiple WCF applications without having to create and deploy multiple packages (not very usefull for deployments)
If I restucture the application, I will have 4 or 5 different services projects and also need an app.config file for each(not easy to maintain or upgrade in production environments)
You can have as many service assemblies in a WCF host as you like just make sure they have unique names. Every service dll gets its own project and the host stays at one project in the solution. Then create an app.config like this:
<services>
<service behaviorConfiguration="serviceBehaviour" name="DLSService.DLSService">
<endpoint address="DLSService" binding="basicHttpBinding" bindingConfiguration=""
name="basicHttpDLS" contract="DLSService.IDLSService" />
<endpoint binding="mexHttpBinding" bindingConfiguration="" name="mexDLS"
contract="IMetadataExchange" />
<endpoint address="DLSService" binding="netTcpBinding" bindingConfiguration=""
name="netTcpDLS" contract="DLSService.IDLSService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/ServicesHost/DLSService" />
</baseAddresses>
</host>
</service>
<service behaviorConfiguration="serviceBehaviour" name="RopsPreorderService.RopsPreorderService">
<endpoint address="RopsPreorderService" binding="basicHttpBinding" bindingConfiguration=""
name="basicHttpPreorderService" contract="PreorderService.IPreorderService" />
<endpoint binding="mexHttpBinding" bindingConfiguration="" name="mexRopsPreorderService"
contract="IMetadataExchange" />
<endpoint address="PreorderService" binding="netTcpBinding" bindingConfiguration=""
name="netTcpPreorderService" contract="RopsPreorderService.IPreorderService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/ServicesHost/PreorderService" />
<add baseAddress="net.tcp://localhost:9000/PreorderService" />
</baseAddresses>
</host>
</service>
</services>

WCF Self Hosting timeout

I have a Unity based C# WPF application that has a Module that communicates to a WCF based project within the same solution.
The WCF dll works if i use the WCF test host make it an active service, but times out if i try to create a ServiceHost from code.
here is the code that is in the Unity Modules Initialization()
host = new ServiceHost(typeof(AtomCfgModelClient));
host.Open();
Here is my app.config section
<endpoint address="http://localhost:8080/AtomCfgModelService"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IAtomCfgModel"
contract="AtomCfgModel.IAtomCfgModel" name="WSHttpBinding_IAtomCfgModel">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
<services>
<service name="AtomCfgModule.AtomCfgModel.AtomCfgModelClient" >
<endpoint address="" binding="wsHttpBinding" contract="AtomCfgModel.IAtomCfgModel" >
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/AtomCfgModelService" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior >
<serviceMetadata httpGetEnabled="True" />
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
ive turned off "start WCF Service Host when debugging " from the wcf project properties setting.
So, the above configuration seems to load ok from the wcf trace file, but when i go to use any of the services, i get a timeout without any information that i can see that lets me know what is causing the timeout.
here is the error message from the wcf trace, prior to this exception message, all the messages seem to succeed.
The HTTP request to 'http://localhost:8080/AtomCfgModelService' has exceeded the allotted timeout of 00:00:59.9840000. The time allotted to this operation may have been a portion of a longer timeout.
What is confusing is that if i use the WCF test host, then the above configuration works
String arg = "/service:\"" + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AtomCfgModel.dll") + "\" /config:\"" + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "GISShell.exe.config") + "\"";
System.Diagnostics.Process.Start(#"c:\WcfSvcHost.exe", arg);
The above code running the wcfsvchost.exe uses the same config ( and WCF dll ) and i dont get the timeout.
Any points on how to debug/fix this would great.

WCF web service - increase timeout

I get this:
An error occurred while receiving the HTTP response to http://localhost:8732/Design_Time_Addresses/PersistencyService/Service1/. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.
Why do I get this? I assume it is because the method takes about 1 min to complete. How can disable any time limit?
I get this when running in VS a Windows form project that uses a WCF service in the same solution
My WCF configuration:
edit:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="LongRunning" sendTimeout="00:10:00" />
</wsHttpBinding>
</bindings>
<client>
<endpoint name="Default"
address="http://localhost:8732/Design_Time_Addresses/PersistencyService/Service1/"
binding="wsHttpBinding"
bindingConfiguration="LongRunning"
contract="PersistencyService.IService1" />
</client>
<services>
<service name="PersistencyService.Service1">
<endpoint
address=""
binding="wsHttpBinding" bindingConfiguration=""
contract="PersistencyService.IService1" >
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/PersistencyService/Service1/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
The exception message is An existing connection was forcibly closed by the remote host.
I must also add that I get about 70MB of data from the service
On the client side, you need to add some settings to your app.config:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="LongRunning" sendTimeout="00:10:00" />
</wsHttpBinding>
</bindings>
<client>
<endpoint name="Default"
address="....."
binding="wsHttpBinding"
bindingConfiguration="LongRunning"
contract="IYourServiceContract" />
</client>
</system.serviceModel>
You didn't give us much to go on - no config, nothing.... so I'm left just guessing what settings you might have.
Basically, you need to define a binding configuration for the type of binding you're using, and you need to increase the sendTimeout attribute on that binding configuration (here in my sample: 10 minutes). You cannot completely turn off the timeout - you can increase it, but not turn it off.
Then, your client side config must make a reference to that binding configuration you've defined, by specifying a bindingConfiguration="...." attribute on the <endpoint> configuration, and using the same name for the binding configuration as when you defined it.
Maybe this is enough - but maybe, you'll also need to increase some of the timeouts on the server side. Try this first - if it doesn't work, come back and ask again - and please, next time: provide us with some more useful info, like your code and config!

How to disable auto-generated WCF configuration

Every time my program runs vs adds the default configuration to my app.config file. At that run it works fine, but at the next run it actually tries to read the config.
The problem is that the default configuration has errors, it adds the attribute "Address", but attritbutes are not allowed to have capitals so it throws an exception.
This means I have to remove the bad section every run!
I've tried to configure the .config but it gives errors.
Here is the code that I use to host the server:
private static System.Threading.AutoResetEvent stopFlag = new System.Threading.AutoResetEvent(false);
ServiceHost host = new ServiceHost(typeof(Service), new Uri("http://localhost:8000"));
host.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "ChessServer");
host.Open();
stopFlag.WaitOne();
host.Close();
Here is the client code that calls the server:
ChannelFactory<IChessServer> scf;
scf = new ChannelFactory<IService>
(new BasicHttpBinding(), "http://localhost:8000");
IService service = scf.CreateChannel();
Thanks for any help.
Edit: Sorry it took me so long, I've been trying to use DualWSHttpBinding instead (since I actually need the server to call client methods to anyway) but still generates the config file. Here's the entire auto-generated config file:
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup><system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Chess.ChessService">
<endpoint Address="" binding="wsHttpBinding" contract="Chess.IChessServer">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint Address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<Add baseAddress="http://localhost:8732/Design_Time_Addresses/Chess/ChessService/" />
</baseAddresses>
</host>
</service>
<service name="Chess.ChessClient">
<endpoint Address="" binding="wsHttpBinding" contract="Chess.IChessClient">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint Address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<Add baseAddress="http://localhost:8732/Design_Time_Addresses/Chess/ChessClient/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
Visual Studio does not re-create the WCF configuration on every run. It will re-create the WCF configuration every time you do an Update Service Reference on your service reference in the project - but it definitely doesn't automatically do that before every run - there must be something else causing you grief here.
Furthermore, you're not connecting to the correct address - your server defines it here:
ServiceHost host = new ServiceHost(..., new Uri("http://localhost:8000"));
host.AddServiceEndpoint(..., .., "ChessServer");
and this results in your endpoint address on the server being
http://localhost:8000/ChessServer
However, you're client appears to attempt to connect to
http://localhost:8000/
and there's no service there.
A last point: if you set up all your things like endpoints, bindings etc. in code, any changes to the config shouldn't even bother you at all - there must be something else causing your problems.
You're quite mistaken. Attribute and element names may be upper or lower case.
What makes you think that the case of the attribute is the problem? And what makes you think that the app.config is changed on every run?

Categories