|
I'm trying to figure out authentication using the HttpWebRequest class. When I try to connect to a resource that requires a password in IE, a dialog pops up where I enter that information. How can I implement the same behavior using HttpWebRequest? When I connect with that class, I receive a 401 not authorized error. Which is fine, but I can't figure out how to show the proper dialog.
Thanks.
|
|
|
|
|
If you get a 401, the correct procedure is to either pass credentials or prompt if you don't have them. So, lets say you have a while (or for) loop (it's good to terminate it at some point). If you get a 401, prompt the user with a Form you could easily create that asks for a username and password (don't forget to set the PasswordChar on the password TextBox ). Then, create an instance of an ICredentials implementation - like NetworkCredentials which is provided in the .NET base class libraries - and assign that instance as your HttpWebRequest.Credentials property. You may want to keep that once you get a 200 (or something besides 401 or another error) response.
If you're running on Windows XP or newer, you can use DPAPI to store the password, which is a Windows facility for storing network and Internet (including Passport) credentials. There's a pretty good article about it on MSDN at http://msdn.microsoft.com/library/en-us/dnnetsec/html/dpapiusercredentials.asp[^]. This isn't required for a solution, though, just more of a nicety for users (and alliviates the burden on you of securely caching passwords for remote resources if you choose to support it).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hmmm. The problem with that solution is that I really don't know what the server requires. The dialog that is displayed can be customized at the server level and I just want to display that one. Some will require the domain and some do not. I have no idea what to put on the form. The wininet dll just handles all of that for you. Isn't there a .NET equivalent?
|
|
|
|
|
The HTTP response will tell you what authentication is supported. That's the HTTP standard (most likely a different RFC - it's been a long time since I studied them). For example, Digest will also pass you a hashcode that you use with yours - can't remember off the top of my head how - and that you pass back to the server for verification and that it uses to verify the password (by performing the same hash and comparing).
You can use some of the other classes in the System.Net namespace, such as the AuthenticationManager , which automatically registers handlers for basic, digest, negotiate, NTLM, and kerberos. Look at the docs for the AuthenticationManager (the actual class documentation, or overview) for an example. Some of these things are handled for you but you still have to tell the HttpWebRequest what the credentials are, which requires that you prompt. Based on the HttpWebResponse.StatusDescription , you could customize your dialog accordingly (providing the basic REALM or something like that).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
friends , i has such problem now, help me plz
I'm going to program a webservice. Its my first time to code such project. i find that when i setup sql server2000 ,the setup progress reminds me that it will be only run on win 2000 system. i want to know that whether anybody who program a webservice project must use win2000 operation system or you can choose winxp? ps: my operation system is winxp. thank u for your help
|
|
|
|
|
Download and use the MSDE (Microsoft Data Engine) from http://www.microsoft.com/sql/msde[^] instead. In most ways, it is SQL Server, but with a limit on connections and lacking only a few features that you most likely won't use (IIRC, like DTS).
This is meant for - and commonly used for - development purposes and you can also distribute it with an application if you have a qualifying product like VS.NET, MS Access, MS Office, and a few others. You can read more about it at the link above.
Also, don't forget to download and install the MSDE Service Pack (SP) 3, which includes a fix for a bad RPC worm that is still seeking vulnerable systems. I forgot to patch one of our web servers once before co-locating and it got infect within 10 seconds of starting the SQL Server instance.
EDIT: Also, any databases you create in the MSDE can be attached to SQL Server. They are the same, in most respects. They support the same T-SQL and many of the same utilities. You can develop on the MSDE and easily move the database to a full-blown SQL Server later if you like.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thank you very much for your patient help i'll try MSDE. thanks
|
|
|
|
|
Hi,
I need to check a database at a set interval without holding up the rest of the program. Also, there is a client-server aspect to the program running over a network and I need to be able to send a message from server to client (using a message box popup on the client) without the server waiting for the client to press the 'OK' button before it can continue. Is this a case of using threading? Hope this makes sense,
Regards,
John
|
|
|
|
|
sounds like it to me... or you could run a seperate process
in .net threads are pretty simple... so you should have no difficulty!
note that you will have at least some slowdown in your main app when your thread is busy...
|
|
|
|
|
johnstacey wrote:
I need to check a database at a set interval without holding up the rest of the program.
Take a look at the different timers that are provided. I would recommend System.Threading.Timer or System.Timers.Timer . Their callbacks are invoked from a thread in the thread pool. Avoid the System.Windows.Forms.Timer because its callback is invoked on the UI thread.
|
|
|
|
|
Heh,
thanks for that. Will give it a go,
Regards,
John
|
|
|
|
|
Hi,
I am trying the suggestions above. But another thing that I need to implement is having the client 'listening' to a port for any messages from the server program. This 'listening' needs to be constantly running in the background while also allowing the client to respond to user actions. Then if the server requests something of the client it will run. Any pointers on how I could implement this. Thanks again,
Regards,
John
|
|
|
|
|
hey!
i've a nice remoting/serialization problem:
i call a method of my server object, which needs a font parameter. if i access this font parameter in my server method i get a remoting exception. the cause of this problem is clear (?): if i read a property value of this font object, the server tries to call the property accessor on client side...
meanwhile i call my method without font parameter and with parameters like fontname, fontsize(...) instead...
but that's not the smoothest way, i think!
is there a way to use font parameters without exception?
font implements iserialization - but why becomes it not serialized?
thanks in advance
|
|
|
|
|
Yes, the Font is serializable, but what channel are you using for remoting? If you are hosting your remoting object in IIS, it can only use the HttpChannel. HTTP - by nature - is one way. The server can't initiate communications with the client. With you pass the name, size, etc., these are all value types (except for strings, which behave similarily) and are pass-by-value without using them as properties or the ref and out keywords.
Also, what exactly is the exception? The Type and message would help.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I'm using a TCP Channel.
The Exception is something like that:
"The Remotechannel has no Channelreceiver, it means that the Server has no registered Serverchannel or that the Application has no matching Clientchannel to communicate with the Server."
The type of the exception is System.Runtime.Remoting.RemotingException
|
|
|
|
|
What type of client- or server-activated type are you using (and which one of those is it)?
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
it's a client-activated object (registered client type).
|
|
|
|
|
It's obvious the server is having trouble communicating with the client. What's not obvious is how you are registering the WKO on the server and connecting to it on the client. If you're using a config file to configure the remoting (both on the server and on the client, which in most cases is a better way so you don't have to recompile), could you post the relevent sections? Don't forget to escape your < and >, or check the "Do not treat <'s as HTML tags" below before posting.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
okay!
i register my object in source code.
here's an extract of the code to do this:
<br />
<br />
public void ConnectToServer(Type ObjectType)<br />
{<br />
TCPChannel Channel=new TcpClientChannel("ClientChannel",null);<br />
ChannelServices.RegisterChannel(Channel);<br />
<br />
RemotingConfiguration.RegisterWellKnownClientType(ObjectType,"tcp://server:10000/server.rem");<br />
}<br />
<br />
<br />
public void PublishObject()<br />
{<br />
TCPChannel Channel=new TcpServerChannel("ServerChannel",10000);<br />
ChannelServices.RegisterChannel(Channel);<br />
<br />
ServerObject Obj=new ServerObject();<br />
RemotingServices.Marshal(Obj,"server.rem",typeof(ServerObject));<br />
}<br />
<br />
|
|
|
|
|
Actually, this looks like a server-activated type. Using RemotingConfiguration.RegisterActivatedClientType would create the client-activated type. I'm having a friend look at this thread, though. He's a little better with this type of Remoting stuff than I.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
One thing that worries me from inspecting this code snip is that you might be mixing your client and server types.
You register ObjectType as your remoted object but then use another object ServerObject on the server. The object being remoted must be the same or implement the same interface. This is important because even if ObjectType is derived from ServerType the Remoting Framework only has registered/recognizes ObjectType as remotable. ServerType is just another type it will handle outside of the Remoting Framework. Both the client and server parts need to be dealing with the same object or deal with an interface or you get the wrong behavior.
Next once you seem to be using RemotingServices.Marshal in the wrong context. Marshal is used to transfer a MarshalByRefObject across application domains which has little to do with actually "publishing" the service.
What I recommend doing is using configuration files on both the client and the server and using RemotingConfiguration.Configure .
The client config file from your code snip should look something like this:
<configuration>
<system.runtime.remoting>
<application>
<client url="tcp://server:10000">
<wellknown
type = "ObjectType,ObjectAssembly"
url = "tcp://server:10000/server.rem" />
<!-- or atlernatively, the client activated version
<activated type="ObjectType,ObjectAssembly" />
-->
</client>
<channels>
<channel ref="tcp" port="10000" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
Your server config file should look something like this:
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="SingleCall" type="ObjectType, ObjectAssembly" objectUri="server.rem" />
<!-- alternatively, the client activated version
<activated type="ObjectType, ObjectAssembly" />
-->
</service>
<channels>
<channel ref="tcp" port="10000" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
If you use config files you don't have to worry about setup or teardown of channels or the registering or unregistering of types. It also makes for easy debugging since you only need to change the config file and run again instead of changing code, compile and run again.
|
|
|
|
|
Many thanks for this hint.
I'll change my remoting stuff in this way.
But solves it the problem of serialization of my Font object too?
|
|
|
|
|
My MethodCall looks like that:
<br />
Font MyFont=new Font("Arial",10);<br />
ServerObject.DoSomething(MyFont);<br />
The method throws an exception e.g. by accessing the Height Property.
|
|
|
|
|
HI
Quite a few times ago while browsing i came to know about the scripts who automate the procedure of registration on websites but now when i need few i am not able to find one. Actually i want to write the same script in C# so if anybody help me to find some good resources on internet.
THANX IN ADVANCE
|
|
|
|
|
I have the following event declaration in a base class window form with a button btnNew
public void btnNew_Click(object sender, System.EventArgs e)
{
btnDelete.Text = "Deleteddy";
// btndelete is another button on the form
And the following event declaration derived class that inherits from the above base class window
new public void btnNew_Click(object sender, System.EventArgs e)
{
MessageBox.Show("Derived");
}
I am using the new modifier in the derived class to "hide" the behaviour in the base class. But when I click the btnNew, both events get fired.
Can anyone explain why ?
Thanks
|
|
|
|