Two rest-style WCF contracts on same endpoint(svc file) - wcf

I am trying to have two contracts under same SVC file, and it is not working. When I open the SVC file in the IE, I get error saying 'Endpoint error'.
If I call the methods of the contract from a client, it wont hit the service.
Servers are hosted on IIS.
Please let me know what is going on here.
Also is it possible to have one wsHttpBinding and one webHttpBinding under same SVC file or web service? They will be hosted on IIS.
SVCFile
<%# ServiceHost Language="C#" Debug="true" Service="S1.ServiceDual6" CodeBehind="ServiceDual6.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
Contracts
{
[InspectorBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ServiceDual6 : IServiceREST, IServiceREST2
{
public string RestInDual_Contract(Message mm)
{
return "";
}
public string RestInDual_Contract2(Message mm)
{
return "";
}
}
}
namespace S1
{
[ServiceContract]
public interface IServiceREST
{
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
string RestInDual_Contract(Message mm);
}
[ServiceContract]
public interface IServiceREST2
{
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
string RestInDual_Contract2(Message mm);
}
}
Web.config
<service name="S1.ServiceDual6" behaviorConfiguration="s1bhrWithHttpEnabled">
<host>
<baseAddresses>
<add baseAddress="http://localhost/S2/Service6.svc"/>
</baseAddresses>
</host>
<endpoint address="" binding="webHttpBinding" contract="S1.IServiceREST" behaviorConfiguration="s1bhr">
</endpoint>
<endpoint address="" binding="webHttpBinding" contract="S1.IServiceREST2" behaviorConfiguration="s1bhr">
</endpoint>
</service>

You need to differentiate the two services by providing different path if hosted on single endpoint. Separate these two by adding unique value in address field.
<endpoint address="Rest/v1" binding="webHttpBinding" contract="S1.IServiceREST" behaviorConfiguration="s1bhr">
</endpoint>
<endpoint address="Rest/v2" binding="webHttpBinding" contract="S1.IServiceREST2" behaviorConfiguration="s1bhr">
</endpoint>
Now you can invoke them by appending Rest/V1for "S1.IServiceREST" and Rest/V2 for "S1.IServiceREST2" in base address.

Related

SwaggerWCF configuration for self hosted WCF library

I'm having some difficulties getting SwaggerWCF to load my documentation page, and I'm not sure why. I get no errors, but I also get no Swagger docs either, just a 404 when I visit http://localhost:8733/docs per the endpoint configuration. What am I doing wrong here? I have everything decorated up, using Framework 4.8. Service works fine and the mex and js endpoints will return data, just no swaggerUI.
Here is my App.Config:
<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" contentTypeMapper="Microsoft.Samples.WebContentTypeMapper.JsonContentTypeMapper, JsonContentTypeMapper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</webHttpEndpoint>
</standardEndpoints>
<services>
<service name="AutodeskVaultAPI.VaultWorker">
<endpoint address="" binding="basicHttpBinding" contract="AutodeskVaultAPI.IVaultServices">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<endpoint address="js" behaviorConfiguration="jsonEP" binding="webHttpBinding"
name="jsonEP" contract="AutodeskVaultAPI.IVaultServices" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733/AutodeskVaultAPI/" />
</baseAddresses>
</host>
</service>
<service name="SwaggerWcf.SwaggerWcfEndpoint">
<endpoint address="http://localhost:8733/docs" binding="webHttpBinding" contract="SwaggerWcf.ISwaggerWcfEndpoint" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" />
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="jsonEP">
<webHttp helpEnabled="true" automaticFormatSelectionEnabled="true"/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Here is my service implementation:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[SwaggerWcf("/AutodeskVaultAPI/js")]
public class VaultWorker : IVaultServices
{
...[redacted]...
[SwaggerWcfTag("AutodeskVaultAPI")]
public AutodeskVaultFolder GetRootFolder(string vaultServerName = "", string currentUserLogin = "false")
{
try
{
Folder rootFolder = VaultConnection.WebServiceManager.DocumentService.GetFolderRoot();
if (null == rootFolder)
return null;
else
{
var toReturn = new AutodeskVaultFolder()
{
Created = rootFolder.CreateDate,
Category = (null == rootFolder.Cat) ? "No Category" : rootFolder.Cat.CatName,
CreatedByUserID = rootFolder.CreateUserId,
CreatedByUserName = rootFolder.CreateUserName,
EntityMasterID = rootFolder.Id,
FolderEntityName = rootFolder.Name,
FolderFullPath = rootFolder.FullName,
IsVaultRoot = true,
NumberOfChildren = rootFolder.NumClds,
ParentID = rootFolder.ParId
};
return toReturn;
}
}
catch (Exception ex)
{
Debug.WriteLine(ex);
return null;
}
}
[SwaggerWcfTag("AutodeskVaultAPI")]
public AutodeskVaultSearchResponse SearchVault(AutodeskVaultSearchRequest request)
{
try
{
string bookMark = string.Empty;
var parameters = getSearchParametersFromRequest(request);
SrchStatus srchStatus = null;
List<File> foundFiles = new List<File>();
if (null != parameters && parameters.Length > 0)
{
while (null == srchStatus || foundFiles.Count < srchStatus.TotalHits)
{
File[] srcResults = VaultConnection.WebServiceManager.DocumentService.FindFilesBySearchConditions(parameters, null, null, true, false, ref bookMark, out srchStatus);
if (null != srcResults)
foundFiles.AddRange(srcResults);
else
break;
}
}
return mapResultsToResponse(request, foundFiles);
}
catch (Exception ex)
{
Debug.Write(ex);
return null;
}
}
...[redacted]...
[DataContract(Name = "AutodeskVaultSearchRequest")]
public class AutodeskVaultSearchRequest
{
[DataMember]
public bool OR_Search = false;
[DataMember]
public List<AutodeskVaultProperty> properties;
}
[DataContract(Name = "AutodeskVaultSearchResponse")]
public class AutodeskVaultSearchResponse
{
[DataMember]
public AutodeskVaultSearchRequest Request;
[DataMember]
public List<AutodeskVaultFile> Files;
[DataMember]
public string Message;
and here is my service interface:
[ServiceContract]
public interface IVaultServices
{
[SwaggerWcfPath("GetRootFolder", #"Test the default configured server to see if we can get back the root folder")]
[OperationContract]
[WebInvoke(UriTemplate = "GetRootfolder/{vaultServerName}/{currentUserLogin}", Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[Description(#"Test the default configured server to see if we can get back the root folder")]
AutodeskVaultFolder GetRootFolder(string vaultServerName = "", string currentUserLogin = "false");
[SwaggerWcfPath("GetAsbuiltDrawingsByNumber", #"Given an Autodesk Search Request, search through Vault to find File information using the supplied properties.")]
[OperationContract]
[WebInvoke(UriTemplate = "SearchVault", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[Description(#"Given an Autodesk Search Request, search through Vault to find File information using the supplied properties.")]
AutodeskVaultSearchResponse SearchVault(AutodeskVaultSearchRequest request);
}
Add an endpoint to your App.config file.
<services>
<service name="SwaggerWcf.SwaggerWcfEndpoint">
<endpoint address="http://localhost/docs" binding="webHttpBinding" contract="SwaggerWcf.ISwaggerWcfEndpoint" />
</service>
</services>
Create a WebServiceHost
var swaggerHost = new WebServiceHost(typeof(SwaggerWcfEndpoint));
swaggerHost.Open();
You can refer to the steps provided in the link for details.
https://github.com/abelsilva/swaggerwcf
How do I view my Swagger docs when using SwaggerWcf?

WCF not exposing method

I have a service contract defined as:
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://www.ans.gov.br/tiss/ws/tipos/tisscancelaguia/v30001", ConfigurationName = "ItissCancelaGuia")]
public interface ItissCancelaGuia
{
[System.ServiceModel.OperationContractAttribute(Action = "tissCancelaGuia", ReplyAction = "*")]
[System.ServiceModel.FaultContractAttribute(typeof(tissFaultWS), Action = "", Name = "tissFaultWS", Namespace = "http://www.ans.gov.br/padroes/tiss/schemas")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(SignatureType))]
mensagemTISS tissCancelaGuia_Operation(string mensagem);
}
And the implementation:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, ConfigurationName = "CancelaGuiaTS")]
public sealed class tissCancelaGuia : ItissCancelaGuia
{...}
and also the relevant parts of the web.config:
<service behaviorConfiguration="tissCancelaGuiaStringServiceBehavior"
name="CancelaGuiaTS">
<endpoint address="" behaviorConfiguration="EndPointValidation"
binding="basicHttpBinding" bindingConfiguration="TISSv3_binding"
name="CancelaGuiaTs" contract="ItissCancelaGuia" />
<endpoint address="mex" binding="mexHttpBinding" name="CancelaGuiaTsMetadata"
contract="IMetadataExchange" />
</service>
and
<behavior name="tissCancelaGuiaStringServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
The service compiles correctly but the wsdl exposed contains no operations.
The only solution I can think of is to write the wsdl manually and expose it through the externalMetadataLocation attibute of the serviceMetadata, but it just don't feel right to me.
Edit 1
Here the definition of the mensagemTISS class
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.ans.gov.br/padroes/tiss/schemas")]
public partial class mensagemTISS
{ ... }
Don't know if it is important but the class have this property:
[System.Xml.Serialization.XmlElementAttribute("operadoraParaPrestador", typeof(operadoraPrestador), Order=1)]
[System.Xml.Serialization.XmlElementAttribute("prestadorParaOperadora", typeof(prestadorOperadora), Order=1)]
public object Item
{
get
{
return this.itemField;
}
set
{
this.itemField = value;
}
}
defined as a choice in the originating schema.

WCF Hosting with IP Address

I have created a WCF Service which return JSON data.
here is my code:
namespace AppServices
{
[ServiceContract]
public interface Service1
{
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/GetCities", BodyStyle = WebMessageBodyStyle.WrappedRequest,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
List<City> GetCityCode();
}
[DataContract]
public class City
{
[DataMember]
public string CityId { get; set; }
[DataMember]
public string CityName { get; set; }
[DataMember]
public string StateId { get; set; }
[DataMember]
public string Priority { get; set; }
}
}
public class ServiceAPI : Service1
{
public List<City> GetCityCode()
{
adp = new SqlDataAdapter("Select * from tblCity", offcon);
adp.Fill(ds, "City");
var city = (from DataRow dr in ds.Tables["City"].Rows
select new
{
Id = dr["intCityId"].ToString(),
Name = dr["strTitle"].ToString(),
sid = dr["intStateId"].ToString(),
priority = dr["intPriority"].ToString()
}).Select(x => new City() { CityId = x.Id, CityName = x.Name, StateId = x.sid, Priority = x.priority }).ToList();
return city;
}
}
my web.config is as follows:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service behaviorConfiguration="ServiceBehaviour" name="PatrikaAPIService.PatrikaService">
<endpoint address="" behaviorConfiguration="web" binding="webHttpBinding"
contract="PatrikaAPIService.IPatrikaService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment/>
</system.serviceModel>
</configuration>
Everything is working fine when i run this wcf on localhost as:
localhost:13186/ServiceApp.svc/GetCities
problem: when i pass my IP address as
192.168.1.16:13186/ServiceApp.svc/GetCities
it is giving an error that website is too busy...
& i want to access this wcf service in URL on other computers i mean other PCs on my Network.
I have changed my web.config as per my requirements now if anyone know what to do next to host this service with IP address.
or Host this into Microsoft 2003 Server SP2.
please help..
I'm assuming this is Cassini? If so - Cassini only responds if the host header is 'localhost' I think. Certainly you won't get it to respond by your IP.
Host it in IIS or IIS Express.
On a different note - if this is a .Net 4 project you might be interested to note that Rest services implemented this way via WCF is soon to become legacy - and be replaced by the Asp.Net Web API once it's gone to RTM (it's currently at RC stage) - I urge you to consider this newer technology if you can (it wouldn't solve this issue though).

Bad Request error on POST to WCF Restful web service Hosted in IIS using Basic Authentication over https

I have a wcf 3.5 restful web service that is hosted in IIS 7.5. It is setup to use Basic Authentication over https. I added as much information as possible below (names of classes, etc have been altered slightly). Any advice or suggestions are greatly appreciated.
Every time I try to send a POST either via Fiddler or through a client application I get this message:
HTTP/1.1 400 Bad Request
I turned on the svctrace logs give me this information:
System.Runtime.Serialization.SerializationException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Unable to deserialize XML body with root name 'user-search-request' and root namespace '' (for operation 'FetchMatchingUsers' and contract ('IMyService', 'http://tempuri.org/')) using DataContractSerializer. Ensure that the type corresponding to the XML is added to the known types collection of the service.
The URL for the service looks like this:
https://mysite.com/program/user/v1.0/MyService.svc
My Service Contract looks like this:
[ServiceContract]
interface IMyService
{
[WebInvoke(UriTemplate = "",
Method = "POST",
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml)]
[OperationContract]
Users FetchMatchingUsers(User u);
}
My Service Implementation looks like this:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MyService : IMyService
{
static Users _users = new Users();
public Users FetchMatchingUsers(User u)
{
return SearchByFullName(u.FirstName, u.LastName);
}
}
The DataContract looks like this:
[CollectionDataContract(Name = "user-search-request", Namespace = "")]
public class Users : List<User>
{ }
[DataContract(Name = "user", Namespace = "")]
public class User
{
[DataMember(Name = "first-name")]
public string FirstName { get; set; }
[DataMember(Name = "last-name")]
public string LastName { get; set; }
}
Service Model is setup like this:
<system.serviceModel>
<diagnostics>
<messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
</serviceHostingEnvironment>
<services>
<service behaviorConfiguration="basic" name="MyService">
<clear />
<endpoint address="/program/user/v1.0" binding="basicHttpBinding"
name="Default" contract="MyService.IMyService"
listenUriMode="Explicit">
<identity>
<certificateReference storeName="My" storeLocation="LocalMachine"
x509FindType="FindBySubjectDistinguishedName" />
</identity>
</endpoint>
<host>
<baseAddresses>
<add baseAddress="https://mysite.com" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="basic">
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="basicHttpBinding">
<readerQuotas maxStringContentLength="10500" />
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
</bindings>
My POST is setup like this:
private void DoPost
{
String firstname = "Test";
String lastname = "User";
User user = new User();
user.FirstName = firstname;
user.LastName = lastname;
String uristring = #"https://mysite.com/program/user/v1.0/MyService.svc/";
Uri uri = new Uri(uristring);
HttpWebRequest client = (WebRequest.Create(uri)) as HttpWebRequest;
NetworkCredential cred = new NetworkCredential(_username, _password, _domain);
String username = cred.Domain + "\\" + cred.UserName;
byte[] credentialBuffer = new UTF8Encoding().GetBytes(username + ":" + cred.Password);
client.Credentials = cred;
client.Method = "POST";
client.ContentType = "application/xml";
client.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
List<User> users = new List<User>();
users.Add(user);
SerializeUsers sa = new SerializeUsers();
String output = sa.SerializeUsers(users);
client.ContentLength = output.Length;
// Write the request StreamWriter
StreamWriter requestWriter = new StreamWriter(client.GetRequestStream(), System.Text.Encoding.ASCII);
requestWriter.Write(output.ToString());
requestWriter.Close();
// Do the request to get the response
try
{
StreamReader responseReader = new StreamReader(client.GetResponse().GetResponseStream());
String response = responseReader.ReadToEnd();
responseReader.Close();
}
catch (WebException ex)
{
String message = ex.Message;
}
}
My Deserializer right now is just a test so the xml is actually hardcoded but I do need to make it work the right way once I get this problem solved.
public class SerializeUsers
{
public String SerializeUsers(List<User> ts)
{
String xml = #"<user-search-request xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">";
foreach (User t in ts)
{
xml += #"<user>";
xml += #"<first-name>" + t.FirstName + "</first-name>";
xml += #"<last-name>" + t.LastName + "</last-name></user>";
}
xml += #"</user-search-request>";
return xml;
}
}
Hello can you try [XmlSerializerFormat] under your service contract so it should look like this:
[ServiceContract]
[XmlSerializerFormat]
interface IMyService
The second thing you might want to do is add a wrapper to your POST like so:
[WebInvoke(UriTemplate = "",
Method = "POST",
BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml)]
Failing that then your config file is to blame if I was to hazard a guess, it should be set up with webHttpBinding.

WCF Call Passing a Null Parameter

I have a WebHttpBinding WCF service that I am calling. My first POST method send the object correctly, but subsequent calls to POST methods are passing null for the object.
Here is my service:
public void Update(ObjectDTO objectDTO)
{
string token = WebOperationContext.Current != null ? WebOperationContext.Current.IncomingRequest.Headers["token"] : string.Empty;
//Authentication
bool isUserAuthenticatedResult = IsUserAuthenticated(ref token);
if (!isUserAuthenticatedResult)
return null;
//Perform service action
MyDtoManager = new MyDtoManager();
objectDTO = MyDtoManager.Update(objectDTO);
return objectDTO;
}
Here is my Service Contract:
[ServiceContract]
public interface IMyDtoService
{
[OperationContract]
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
List<ObjectDTO> LoadById(string value);
[OperationContract]
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
List<ObjectDTO> Load(string field, string value);
[OperationContract]
[WebInvoke(Method="GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
List<ObjectDTO> LoadAll();
[OperationContract(Name = "InsertSingle")]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
ObjectDTO Insert(ObjectDTO objectDto);
[OperationContract(Name = "UpdateSingle")]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
ObjectDTO Update(ObjectDTO objectDto);
[OperationContract(Name = "DeleteSingle")]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
ObjectDTO Delete(ObjectDTO objectDto);
}
Here is my server configuration:
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="WebHttpBindingConfig"
openTimeout="00:05:00"
sendTimeout="00:05:00"
maxBufferSize="65536000"
maxBufferPoolSize="52428800"
maxReceivedMessageSize="65536000"
transferMode="Buffered">
<readerQuotas maxDepth="32"
maxStringContentLength="65536000"
maxArrayLength="16384"
maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<security>
<transport />
</security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="Services.ServiceBehavior"
name="Services.MyDtoService">
<endpoint address=""
behaviorConfiguration="HttpBehavior"
binding="webHttpBinding"
name="Services.MyDtoService"
contract="ServiceInterfaces.IMyDtoService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Services.ServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="HttpBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
And finally my client code making the call:
IMyDtoService myDtoService = new WebChannelFactory<IMyDtoService>(BindingConfig, new Uri("http://localhost:8080/MyDtoService.svc")).CreateChannel();
using (new OperationContextScope((IClientChannel)myDtoService))
{
if (WebOperationContext.Current != null)
WebOperationContext.Current.OutgoingRequest.Headers.Add("token", tokenResult.Result);
ObjectDTO insertResult = ipAddressService.Insert(new ObjectDTO
{ ObjectGuid = Guid.NewGuid(),
IsAllow = true,
Identifier = 1,
IdentifierType = 0,
StartIpAddress = "192.168.0.1"
});
List<ObjectDTO> loadByIdResult1 = myDtoService.LoadById(insertResult.ObjectGuid.ToString());
Console.WriteLine("Insert Found: " + loadByIdResult1.Count);
insertResult.IsAllow = false;
ObjectDTO updateResult = ipAddressService.Update(insertResult);
}
As you can see my client code calls my WCF service and the insert method works perfectly fine and I can see the persisted object in my database. However on the update, the ObjectDTO parameter is null. If I load an existing object and perform an update it works perfectly. It appears to be an issue with subsequent calls to the WCF service using POST methods. I do not have this problem with GET methods.
I have gone through this problem but WCF SOAP. On client site you can see object filled with values when debug point comes in service it is null. It had happened due to change in casing of param. . If you see your service contract has
ObjectDTO Update(ObjectDTO objectDto);
and defination has public void Update(ObjectDTO objectDTO) , note the difference in casing.
You have not shown the relevant code to be 100% sure what the problem is. But it looks like it is null because this line:
ObjectDTO insertResult = ipAddressService.Insert(new ObjectDTO
{ ObjectGuid = Guid.NewGuid(),
IsAllow = true,
Identifier = 1,
IdentifierType = 0,
StartIpAddress = "192.168.0.1"
});
is returning null. So you need to check the insert method.