Mhm, that’s where the problem lies. You should not use method B 
Let me explain how you should do this.
On the server side:
When the server receives the event (when a client fired), it should immediately check if the player hits the other player (victim). Then, you would use the Rays method you mentioned, or other ways, to check if the player actually hits the victim. Either way, once you have done that, it’s time to notify the other clients that this player fired the gun. - Make sure to include the player who shot, and the player that got hit (if any), amount of damage etc.
You should also deduct the damage of the shot from the victim’s health, and all the other stuff that comes with shooter games. (I’m pretty sure you knew this already
)
The client who fired
Once this client fires the gun, a projectile would come out immediately, to give the player an enhanced impression of the game. They don’t want to see their bullets shoot .5 seconds after shooting!!
Then, use client-sided hit detection to see if they hit their victim, if they did, you can play some sound or show that you damaged them.
This client should ignore the incoming event from the server about the projectile, but it could get to know the damage made (client and server don’t always agree, since there is a delay).
On the other clients
When the remaining clients receive the projectile event, all they have to do is to figure out if they want to render the projectile. Use distance, if they are in the viewport, and their quality settings to determine whether to render the projectile or not.
TL;DR
Client shoots → Client renders projectile → Tells server → Server notifies other clients → Other clients render (or not) the projectiles.