I created WCF service. when i test it with WCF Test Client , the service works fine.
I decided to configure the end point to display the result using the browser.
I have a blank page with the text Endpoint not found. with no more details.
Here is my web.config
<system.serviceModel>
<services>
<service name="mCollectorService.CollectorService" behaviorConfiguration="mCollectorService.CollectorServiceBehavior">
<endpoint address="../CollectorService.svc"
binding="webHttpBinding"
contract="mCollectorService.ICollectorService"
behaviorConfiguration="webBehaviour"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mCollectorService.CollectorServiceBehavior">
<!-- 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>
<endpointBehaviors>
<behavior name="webBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
Here is my ICollectorService
[ServiceContract]
public interface ICollectorService
{
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "Authenticate/{agentcode}/{pin}/{deviceIMEI}/{gpslat}/{gpslong}")]
Authentification Authenticate(string agentcode,string pin, string deviceIMEI, string gpslat, string gpslong);
}
Any Help.
Try modifying your Service like this:
<services>
<service name="mCollectorService.CollectorService" behaviorConfiguration="mCollectorService.CollectorServiceBehavior">
<endpoint address="../CollectorService.svc"
binding="webHttpBinding"
contract="mCollectorService.ICollectorService"
behaviorConfiguration="webBehaviour"
/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:51855/CollectorService.svc" />
</baseAddresses>
</host>
</service>
</services>
And Change your OperationContract
[ServiceContract]
public interface ICollectorService
{
[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "Authenticate/{agentcode}/{pin}/{deviceIMEI}/{gpslat}/{gpslong}")]
Authentification Authenticate(string agentcode,string pin, string deviceIMEI, string gpslat, string gpslong);
}
And Call your URL in this way!
http://localhost:51855/CollectorService.svc/CollectorService.svc/Authenticate/YourAgentCode/YourPin/YourDeviceIMEI/YourGPSLat/YourGPSLong
Hope this will help. Thank You!
EDIT: I will recommend you to wrap your request in JSON instead of sending it in the Request URL if you are implementing Authentication mechanism.
Related
I created a wcf service with two different endpoints using basicHttpBinding and webHttpBinding. I have a asp mvc client consuming the basicHttpBinding endpoint and angular controller consuming the webHttpBinding. However when I call the endpoint using the webHttpBinding via browser and angular controller I am getting connection refused error. How can I fix this problem or what am I doing wrong (New to WCF).
Service Contract:
[ServiceContract]
public interface IVacationService
{
[WebInvoke(UriTemplate = "create",ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
VacationDC RequestVacation(VacationDC vacation);
[WebGet(UriTemplate = "approved",ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
IEnumerable<VacationDC> GetApprovedVacations();
[WebGet(UriTemplate = "all", ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
IEnumerable<VacationDC> GetAllVacations();
[WebInvoke(UriTemplate = "remove/{id}", Method = "DELETE",RequestFormat = WebMessageFormat.Json)]
[OperationContract]
void RemoveVacation(long id);
}
Web.config:
<services>
<service name="WcfService.VacationService">
<endpoint address="basic" binding="basicHttpBinding" name="Soap" contract="WcfService.IVacationService" />
<endpoint address="api" binding="webHttpBinding" name="rest" contract="WcfService.IVacationService" behaviorConfiguration="webRest"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8092/vacation" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webRest">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
I have WCF Service, my goal is to be able to retrieve information from my server using GET and POST. I almost got it to work. My problem is that to be able to access the information on the server I need to enter my credentials, otherwise I get the error 401 unauthorized
I tried a few different things but I'm still new at using XML and when I try to add some code I always get errors.
This is my code:
C#
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "xml/{id}")]
string XMLData(string id);
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "json/{id}")]
string JSONData(string id);
}
XML
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="RestService.RestServiceImpl" behaviorConfiguration="ServiceBehaviour">
<!-- Service Endpoints -->
<!-- Unless fully qualified, address is relative to base address supplied above -->
<endpoint address ="" binding="webHttpBinding" contract="RestService.IRestServiceImpl" behaviorConfiguration="web">
<!--
Upon deployment, the following identity element should be removed or replaced to reflect the
identity under which the deployed service runs. If removed, WCF will infer an appropriate identity
automatically.
-->
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<!-- 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="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
I still don't know how to fix this.
Try this (link to code download below listing):
// IRestService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace RestService
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "xml/{id}")]
string XMLData(string id);
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "json/{id}")]
string JSONData(string id);
}
}
// RestService.cs
namespace RestService
{
public class RestServiceImpl : IRestServiceImpl
{
public string JSONData(string id)
{
return id;
}
public string XMLData(string id)
{
return id;
}
}
}
<!-- RestService.svc (Source) -->
<%# ServiceHost Language="C#" Debug="true" Service="RestService.RestServiceImpl" CodeBehind="RestService.svc.cs"
Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
<!-- Web.config -->
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="RestService.RestServiceImpl" behaviorConfiguration="ServiceBehaviour">
<endpoint address="" binding="webHttpBinding" bindingConfiguration="webBinding" contract="RestService.IRestServiceImpl" behaviorConfiguration="web">
</endpoint>
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="webBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="Windows">
</transport>
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<windowsAuthentication allowAnonymousLogons="false" includeWindowsGroups="true" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Results below (your base URL will likely differ). Ignore the "Endpoint not found" message you see. Rest services should not expose metadata (unless HATEOAS is considered metadata in your mind :)
http://localhost:62001/RestService.svc/xml/absee
<XMLDataResponse xmlns="http://tempuri.org/">
<XMLDataResult>absee</XMLDataResult>
</XMLDataResponse>
http://localhost:62001/RestService.svc/json/absee
{"JSONDataResult":"absee"}
Download the code here
You may want to set it to run under IIS Express in the project settings under the Web tab.
My service model looks as follows.
<system.serviceModel>
<services>
<service name="Web.General" behaviorConfiguration="common">
<endpoint address="basic"
binding="basicHttpBinding"
contract="Web.IGeneral" />
<endpoint
...
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="common">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment
aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
When I hit .../general.svc/ping/1 I get error 400 Bad Request, which I can't explain. What is that and how can I kill it?
My service has interface as follows.
[ServiceContract]
public interface IGeneral
{
//[OperationContract(Name = "Ping")]
[WebInvoke(
Method = "GET",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
//RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "Ping/{input}")]
String Ping(String input);
}
Mate, I'v e been in to this situation and the best approach to solve this out is through Fiddler. 404 can be due to anything at server level. How about running a fiddler and see the RAW request - response
http://www.telerik.com/download/fiddler
Otherwise, enable WCF logging.
http://www.codeproject.com/Articles/383162/Logging-and-Tracing-WCF-Soap-Messages
And then use trace viewer:
http://msdn.microsoft.com/en-us/library/ms732023(v=vs.110).aspx
If you want us to give a concrete answer then you probably need to provide us more details.
I get a error 400, Bad Request.
I have a set of pages that i was trying to write. (Listing only relevant)
./Webpage.aspx
./webservices/WebCalls.svc
./webservices/IWebCalls.cs
./Web.config
and i was looking all over to allow my frontend to communicate with the Webcalls page like follows:
$.ajax({
url: "webservices/WebCalls.svc/DoWork",
success: function(){
console.log(arguments);
}
});
but it doesnt seem to work.
I was thinking to create the files as such:
WebCalls.svc:
public class WebCalls: IWebCalls
{
public string DoWork()
{
return "{\"hello\":\"Chop Wood, Carry Water.\"}";
}
}
and IWebCalls.cs:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public interface IWebCalls
{
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "DoWork")]
string DoWork();
}
and in my webConfig, i thought i set it up correctly:
<behaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp helpEnabled="true" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" httpGetUrl=""/>
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
<service behaviorConfiguration="ServiceBehavior" name="MyProj.WebCalls">
<endpoint address="" behaviorConfiguration="web" binding="webHttpBinding"
bindingConfiguration="LargeWeb" name="LargeWeb" contract="MyProj.webservices.IWebCalls" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="LargeWeb"
maxBufferPoolSize="15000000"
maxReceivedMessageSize="15000000"
maxBufferSize="15000000">
<readerQuotas
maxArrayLength="15000000"
maxBytesPerRead="15000000"
maxDepth="32"
maxNameTableCharCount="15000000"
maxStringContentLength="15000000"
/>
</binding>
</webHttpBinding>
</bindings>
When i run it, it just tells me that it has created a service, but when i try to call: DoWork it gets a 400 error.
Am I doing something wrong with my approach? Im just trying to build up a set of pages such that i can query for data. Originally, i was going to create a GenericHander.asxh for EACH function i wanted to create, but i thought that was too much space. I knew something like this was an option, but it seems that it doesnt work.
You may have decorated the wrong interface ITestService. Instead check the declaration of IWebCalls.
EDIT: Hmm.. I see you updated question ...
I think your services name should probably be name="MyProj.webservices.WebCalls" - but assuming that too is a typo, the only issue I see is that mex endpoint should not be there. mex endpoints are not meant for REST based services.
I am writing a WCF Rest service to return a JSON message. I've been trying to use an example I found on the internet as a guide. Any time I fire up the test client, none of my methods are displayed. Navigating to the Uri while the service is running yields me a "page cannot be displayed" page. Not exactly too sure where to go from here. Any help would be appreciated.
Web Config:
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingWithJasonP"
crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
<services>
<service name="WcfRestLicense.LicenseService"
behaviorConfiguration="WebServiceBehavior">
<endpoint behaviorConfiguration="jsonBehavior"
binding="webHttpBinding"
bindingConfiguration="webHttpBindingWithJasonP"
contract="WcfRestLicense.ILicenseService" />
<endpoint contract="IMetadataExchange"
binding="mexHttpBinding"
address="mex" />
</service>
</services>
<!--<client />-->
<behaviors>
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="WebServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add
scheme="http"
binding="webHttpBinding"
bindingConfiguration="webHttpBindingWithJasonP" />
</protocolMapping>
<serviceHostingEnvironment
aspNetCompatibilityEnabled="false"
multipleSiteBindingsEnabled="true" />
Service method:
public IQueryable<customer> GetCustomerById(string customerId)
{
int custId = Convert.ToInt32(customerId);
return _context.customers.Where(c => c.cust_id == custId);
}
Interface:
[ServiceContract]
public interface ILicenseService
{
[OperationContract]
[WebGet(UriTemplate = "customer/{customerId}/",
RequestFormat= WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
IQueryable<customer> GetCustomerById(string customerId);
}
If by test client you're talking about the WcfTestClient, then it won't work with RESTful services; it's designed to work with SOAP based web services. You can test RESTful services in a browser by passing in the appropriate URI, something like this:
http://<location of your service>/service/1
Where the number 1 would be a customer ID. This is a rough example as a) I don't do a lot with RESTful services and b) I'm not sure what your actual address is.
As far as getting a 404 when you go to the Uri, it sounds like you're looking for the help page. You can enable that in your config file:
<bindings>
<webHttpBinding>
<binding name="webHttpBindingWithJasonP"
crossDomainScriptAccessEnabled="true"
enableHelp="true" />
</webHttpBinding>
</bindings>